我是FTPing,一个使用的远程FTP站点的压缩文件。然后,我尝试将其写入磁盘。但是,大多数使用WinZip或WinRar打开zip的尝试都失败了;这两个应用程序都声称文件已损坏。然而,奇怪的是,当右键单击并试图使用WinRar提取文件时,该文件将被解压缩。
因此,要明确的是,文件写入将工作,但不会打开在流行的压缩应用程序,但将解压缩使用相同的应用。请注意,模块从不失败地提取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()发布于 2009-02-23 01:13:59
直接将file.write传递到retrbinary中,而不是传递appender。这将工作,它也不会使用那么多的RAM,当你下载一个大文件。
但是,如果希望存储在变量中的数据,也可以有一个名为:
blocks = []然后传递给retrbinary而不是appender:
blocks.append您当前的附录函数是错误的。当存在二进制数据时,+=将无法正常工作,因为它将尝试执行一个字符串追加,并在它看到的第一个NULL处停止。
正如@Lee所提到的,您也可以使用urllib2或Curl。但是,如果您做了上面提到的一些小修改,那么当前的代码几乎是正确的。
发布于 2009-02-23 01:12:00
我从未使用过这个库,但是urllib2工作得很好,而且更直接。卷发更好。
看看你的代码,我可以看到一些错误的地方。您的异常捕获只打印异常,然后继续。对于致命的错误,如没有获得FTP连接,它们需要打印消息,然后退出。另外,您的文件数据以“无”开始,然后您的附录使用+=来添加,因此您尝试添加一个字符串+无,这在我这里尝试时给出了一个TypeError。我很惊讶它能起作用;我会猜到这个附录会抛出一个异常,所以FTP副本就会中止。
在重新阅读时,我刚刚注意到关于二进制数据上使用+=的另一个答案。很有可能是这样;python有时会很聪明,当您将字符串中的空格或空或类似的东西连接起来时,可能会“有所帮助”。您最好的选择是打开该文件(让我们将其称为“外文件”),并使用您的附录来只打开outfile.write(块)。
https://stackoverflow.com/questions/576238
复制相似问题