Path.write_bytes破坏通过FTP.retrbinarary传输的文件

时间:2019-06-15 21:06:54

标签: python-3.x ftplib pathlib

我已将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的可移植性,而不是使用文件对象……在任何情况下,这是库错误还是我缺少的东西? 预先感谢

1 个答案:

答案 0 :(得分:0)

感谢@jasonharper。 Lib / pathlib.py中的Python文档指出: “ Path.write_bytes(数据) 打开以字节模式指向的文件,向其中写入数据,然后关闭文件:“

因此它每次都打开。 open(...'wb')使用io.BufferedIOBase。