我已经发布了一些似乎相关的问题,但这些问题与我所遇到的问题并不完全相同:
我正在使用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。
我做错了什么以及如何解决?
答案 0 :(得分: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 [,rest]])
以二进制传输模式检索文件。命令应该是一个 适当的RETR命令:'RETR filename'。 回调功能是 使用单个字符串参数调用每个接收的数据块 给出数据块。 [...]
在您的示例中,它应为outfile.write
(而不是outfile.write(i)
)。
>>> ftp.retrbinary('RETR %s' % i, outFile.write)