1

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

我正在使用 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。

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

4

1 回答 1

0

根据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(命令,回调[,maxblocksize [,休息]])

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

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

>>> ftp.retrbinary('RETR %s' % i, outFile.write)
于 2013-11-13T23:52:47.790 回答