使用 python ftplib 下载二进制格式的 zip 文件

Posted

技术标签:

【中文标题】使用 python ftplib 下载二进制格式的 zip 文件【英文标题】:Downloading a zipfile in binary format using python's ftplib 【发布时间】: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。

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

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于使用 python ftplib 下载二进制格式的 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用python ftplib包递归下载文件夹及文件

python ftplib下载文件封装

Python之ftplib模块

python ftplib监控文件修改时间

python:使用ftplib编写FTP客户端

Python 3 ftplib错误“名称或服务未知”