用Python下载zip文件并将其写入磁盘有什么特别的技巧吗?

用Python下载zip文件并将其写入磁盘有什么特别的技巧吗?,python,ftp,ftplib,Python,Ftp,Ftplib,我正在使用Python的ftplib从远程FTP站点FTPing一个zip文件。然后我尝试将其写入磁盘。文件写入工作正常,但是大多数使用WinZip或WinRar打开zip的尝试都失败了;两个应用都声称文件已损坏。但奇怪的是,当右键单击并尝试使用WinRar提取文件时,文件将被提取 因此,要明确的是,文件写入可以工作,但不会在流行的zip应用程序中打开,而是使用这些应用程序解压。请注意,Python zipfile模块总是能够提取zip 下面是我用来从FTP站点获取zip文件的代码(请忽略错误的

我正在使用Python的ftplib从远程FTP站点FTPing一个zip文件。然后我尝试将其写入磁盘。文件写入工作正常,但是大多数使用WinZip或WinRar打开zip的尝试都失败了;两个应用都声称文件已损坏。但奇怪的是,当右键单击并尝试使用WinRar提取文件时,文件将被提取

因此,要明确的是,文件写入可以工作,但不会在流行的zip应用程序中打开,而是使用这些应用程序解压。请注意,Python zipfile模块总是能够提取zip

下面是我用来从FTP站点获取zip文件的代码(请忽略错误的标签,这不是问题所在)


我从未使用过该库,但urllib2工作得很好,而且更简单。卷曲更好

看看你的代码,我发现有两件事不对。异常捕获只打印异常,然后继续。对于无法获得FTP连接等致命错误,他们需要打印消息,然后退出。另外,您的filedata以None开头,然后您的appender使用+=来添加它,所以您尝试附加一个字符串+None,当我在这里尝试时,它会给出一个TypeError。我很惊讶它居然能起作用;我猜appender会抛出一个异常,因此FTP拷贝会中止


在重读时,我注意到另一个关于在二进制数据上使用+=的答案。很可能就是这样;python有时会表现得很聪明,当您连接带有空格或NUL的字符串或诸如此类的东西时,它可能会起到“帮助”作用。最好的办法是打开文件(我们称之为outfile),然后使用appender只输出file.write(chunk)。

直接在retrbinary函数中传递file.write,而不是传递appender。这将起作用,而且在下载大文件时也不会使用太多RAM

但是,如果希望将数据存储在变量中,也可以使用名为:

blocks = []
然后传递到retrbinary而不是appender:

blocks.append
您当前的appender函数错误。+=当存在二进制数据时将无法正常工作,因为它将尝试执行字符串追加,并在看到第一个NULL时停止


正如@leeb所提到的,您也可以使用urllib2或Curl。但是,如果您做了上面提到的小修改,那么您当前的代码几乎是正确的

我应该说我完成了所有“真正的”异常处理,这只是说明问题的基础。
blocks.append