我已将ftplib.FTP子类化,以便从FTP服务器下载一些xml文件。我已经将FTP.retrbinary与Path.write_bytes用作回调。脚本成功运行,但是xml文件较小,并且任何浏览器或ET.parse都无法读取。我曾尝试在其他服务器上使用mp4文件,但它们不可读。 当我对二进制打开的open返回的文件对象使用write方法时,它可以与xml和mp4一起使用。
我在Windows 2008/7环境中使用py3.5,然后在具有Internet FTP服务器的Linux上使用。我首先尝试使用FTP.retrlines,但是xml文件的行很长,我不希望更改FTP.maxline。而且我怀疑我有同样的问题。
类MyFTP(ftplib.FTP): ... def saveFile1(self,filePath:Path):#损坏文件! 命令=“ RETR” + str(filePath)
callback = filePath.write_bytes
try:
self.retrbinary(command, callback)
except ftplib.all_errors:
raise MyException('File retrieval failed.')
def saveFile2(self, filePath: Path): # this works
command = "RETR " + str(filePath)
fileName = str(filePath)
fd = open(fileName, 'wb')
callback = fd.write
try:
self.retrbinary(command, callback)
except ftplib.all_errors:
raise MyException('File retrieval failed.')
我更喜欢使用Path来实现OS的可移植性,而不是使用文件对象……在任何情况下,这是库错误还是我缺少的东西? 预先感谢
答案 0 :(得分:0)
感谢@jasonharper。 Lib / pathlib.py中的Python文档指出: “ Path.write_bytes(数据) 打开以字节模式指向的文件,向其中写入数据,然后关闭文件:“
因此它每次都打开。 open(...'wb')使用io.BufferedIOBase。