【问题标题】:Downloading a zipfile in binary format using python's ftplib使用 python ftplib 下载二进制格式的 zip 文件
【发布时间】:2012-12-10 20:34:44
【问题描述】:

我已经解决了很多问题,这些问题似乎相关,但与我遇到的问题并不完全相同:

我正在使用 python 的 ftplib 模块和 zipfile 从 ftp 下载二进制格式的 zip 文件。但是,由于某种原因,下载的 zip 文件似乎是 ascii 格式的。

我已确保我正在下载的文件的路径中不存在前导 /(以匹配 zip 规范)。

outFile = zipfile.ZipFile(local_file_path, 'w')
myftp.retrbinary('RETR %s' %i, outFile.write(i))  #i - target file path on ftp server

此代码未能给我以下错误:

st = os.stat(filename)
OSError: [Errno 2] No such file or directory: //$i

我尝试为二进制文件添加 'b' 选项,但 zipfile 似乎不喜欢它:

outFile = zipfile.ZipFile(local_file_path, 'wb')

这会引发错误:

RuntimeError: ZipFile() requires mode "r", "w", or "a"

我正在使用 python v2.6。

我做错了什么以及如何解决?

【问题讨论】:

    标签: python-2.6 zipfile


    【解决方案1】:

    根据 python doc (http://docs.python.org/2/library/ftplib.html) 似乎 retrbinary 将回调作为第二个参数:

    >>> ftp.retrbinary('RETR README', open('README', 'wb').write)
    '226 Transfer complete.'
    >>> ftp.quit()
    

    文档说:

    FTP.retrbinary(command, callback[, maxblocksize[, rest]])

    二进制传输模式检索文件。命令应该是 适当的 RETR 命令:'RETR 文件名'。 回调函数是 为接收到的每个数据块调用,使用单个字符串参数 给出数据块。 [...]

    在您的示例中,它应该是 outfile.write(而不是 outfile.write(i))。

    >>> ftp.retrbinary('RETR %s' % i, outFile.write)
    

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2013-08-30
      相关资源
      最近更新 更多