Python ftplib 损坏文件?

5

我正在使用ftplib在Python中下载文件,直到最近一切似乎都很顺利。我是这样下载文件的:

ftpSession = ftplib.FTP(host,username,password)
ftpSession.cwd('rlmfiles')
ftpFileList = filter(lambda x: 'PEDI' in x, ftpSession.nlst())
ftpFileList.sort() 
for f in ftpFileList:
    tempFile = open(os.path.join(localDirectory,f),'wb')
    ftpSession.retrbinary('RETR '+f,tempFile.write)
    tempFile.close()
ftpSession.quit()
sys.exit(0)

最近我需要下载一些文件,一开始下载得很好,跟预期一样。但现在,我下载的文件都是损坏的,只包含了一长串垃圾ASCII码。我知道这不是文件上传到FTP上的问题,因为我还有一个Perl脚本也从同一个FTP上成功地下载了这些文件。

如果还需要其他信息,下面是调试器在命令提示符中下载文件时输出的内容:

enter image description here

有没有人在使用Python的ftplib库中的retrbinary()函数下载文件时遇到过文件内容损坏的问题?

我真的卡住了/感到沮丧,没有找到任何与可能的损坏相关的信息。谢谢帮忙。

1个回答

2

昨天我遇到了这个问题,当我试图下载文本文件时。不确定你是否也是在做同样的事情,但由于你说里面有ASCII垃圾,我猜测你打开它是因为它应该是文本文件。

如果是这种情况,问题就出在文件是文本文件,而你正在尝试以二进制模式下载它。

相反,你需要以ASCII传输模式检索文件。

tempFile = open(os.path.join(localDirectory,f),'w')  # Changed 'wb' to 'w'
ftpSession.retrlines('RETR '+f,tempFile.write)       # Changed retrbinary to retrlines

不幸的是,这会去掉文件中的所有换行符。糟糕!

因此,您需要再次添加被去除的换行符:

tempFile = open(os.path.join(localDirectory,f),'w')
textLines = []
ftpSession.retrlines('RETR '+f,textLines.append)
tempFile.write('\n'.join(textLines))

这应该可以工作,但它看起来不够好。因此,稍微清理一下就可以得到:

temporaryFile   = open(os.path.join(localDirectory, currentFile), 'w')
textLines       = []
retrieveCommand = 'RETR '

ftpSession.retrlines(retrieveCommand + currentFile, textLines.append)
temporaryFile.write('\n'.join(textLines))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接