使用 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 文件的主要内容,如果未能解决你的问题,请参考以下文章