Ste*_*ult 5 python ftp corruption
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
直到最近,它仍按预期下载了我需要的文件。但是,现在,我正在下载的“我的文件”已损坏,仅包含一长串垃圾ASCII。我知道不是将文件发布到FTP上,因为我也有一个Perl脚本可以从同一FTP成功完成此操作。
如果还有其他信息,这是调试器在下载文件时在命令提示符下显示的内容:

是否有人retrbinary()在Python的ftplib中使用损坏的文件内容遇到任何问题?
我真的很困/沮丧,并且在这里没有遇到与可能的腐败相关的任何事情。任何帮助表示赞赏。
我昨天尝试下载文本文件时刚刚遇到这个问题。不确定这是否是你正在做的事情,但既然你说它里面有 ASCII 垃圾,我假设你在文本编辑器中打开它,因为它应该是文本。
如果是这种情况,问题在于该文件是文本文件,而您正尝试以二进制模式下载它。
您想要做的是以 ASCII 传输模式检索文件。
tempFile = open(os.path.join(localDirectory,f),'w') # Changed 'wb' to 'w'
ftpSession.retrlines('RETR '+f,tempFile.write) # Changed retrbinary to retrlines
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会从文件中删除所有换行符。哎呀!
因此,您需要再次添加删除的换行符:
tempFile = open(os.path.join(localDirectory,f),'w')
textLines = []
ftpSession.retrlines('RETR '+f,textLines.append)
tempFile.write('\n'.join(textLines))
Run Code Online (Sandbox Code Playgroud)
这应该可行,但看起来并不那么好。因此,一点点清理工作将使我们:
temporaryFile = open(os.path.join(localDirectory, currentFile), 'w')
textLines = []
retrieveCommand = 'RETR '
ftpSession.retrlines(retrieveCommand + currentFile, textLines.append)
temporaryFile.write('\n'.join(textLines))
Run Code Online (Sandbox Code Playgroud)