是否有一个特殊的技巧来下载一个ZIP文件,并将其与Python写入磁盘?
题
我从远程FTP站点使用Python的FTP发布FTPLIB一个zip文件。然后,我尝试将其写入到磁盘。该文件写的作品,但大多数尝试打开使用WinZip或WinRAR的失败拉链;这两个应用要求的文件被破坏。奇怪的是然而,当右击并试图用winrar,该文件以提取文件的将提取物。
所以要明确,文件写入会工作,但不会的打开的流行拉链的应用程序里面,但将会的解压缩使用那些相同的应用程序。注意,Python的zip文件模块从未未能提取拉链。
下面是我使用来从FTP站点的zip文件(请忽略坏的黏合,这不是问题)的代码。
filedata = None
def appender(chunk):
global filedata
filedata += chunk
def getfile(filename):
try:
ftp = None
try:
ftp = FTP(address)
ftp.login('user', 'password')
except Exception, e:
print e
command = 'RETR ' + filename
idx = filename.rfind('/')
path = filename[0:idx]
ftp.cwd(path)
fileonly = filename[idx+1:len(filename)]
ftp.retrbinary('RETR ' + filename, appender)
global filedata
data = filedata
ftp.close()
filedata = ''
return data
except Exception, e:
print e
data = getfile('/archives/myfile.zip')
file = open(pathtoNTFileShare, 'wb')
file.write(data)
file.close()
解决方案
file.write直接retrbinary函数而不是传递附加器内传递。这将工作,它也不会当你下载一个大文件中使用那么多内存。
如果你想存储在一个变量中,虽然数据,你也可以有一个名为变量:
blocks = []
然后传递给retrbinary代替附加器:
blocks.append
您当前的附加器功能失常。 + =将无法正常工作时,有二进制数据,因为它会尝试做一个字符串附加在它看到第一个NULL停止。
正如@Lee B中提及也可以使用的urllib2或卷曲。但是,当前的代码几乎是正确的,如果你做了小的修改我上面提到的。
其他提示
我从来没有使用该库,但urllib2的正常工作,更简单。卷曲,甚至更好。
在你的代码看,我可以看到几件事情是错误的。你只异常醒目将异常,然后继续。对于像没有获得FTP连接致命错误,他们需要打印的消息,并退出。此外,您的FILEDATA开始了为无,那么你的appender使用+ =添加到这一点,所以你要追加一个字符串+无,这给当我尝试在这里一个TypeError。我很惊讶它的工作在所有;我早就猜到了附加器会抛出一个异常,所以FTP副本将中止。
在重新读取,我只注意到关于使用+ =上的二进制数据的另一种答案。这很可能是它;蟒蛇试图成为智能有时候,并且可以“帮助”当你加入与空白或在其中完全无效,或类似的东西串。你最好有对已打开的文件(让我们称之为OUTFILE),并使用您的appender只outfile.write(块)。