Path.write_bytes повреждает файлы, переданные с FTP.retrbinarary - PullRequest
0 голосов
/ 16 июня 2019

У меня есть подкласс ftplib.FTP для загрузки некоторых XML-файлов с FTP-сервера.Я использовал FTP.retrbinary с Path.write_bytes в качестве обратного вызова.Скрипт успешно запущен, но xml-файлы меньше по размеру и не читаются ни одним браузером или ET.parse.Я пробовал на другом сервере с файлом mp4, и они не читаются.Когда я использую метод записи для файлового объекта, возвращаемого open в двоичном режиме, он работает с xml и mp4.

Я использую py3.5 в среде Windows 2008/7, а затем в Linux с интернет-FTP-сервером.,Я сначала попробовал с FTP.retrlines, но у файла xml есть очень длинные строки, и я предпочитаю не изменять FTP.maxline.И я подозреваю, что у меня та же проблема.

класс MyFTP (ftplib.FTP): ... def saveFile1 (self, filePath: Path): # Повреждает файлы !!command = "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 для переносимости ОС вместо файлового объекта ... в любом случае, это ошибка библиотеки или что-то мне не хватает?Заранее спасибо

1 Ответ

0 голосов
/ 16 июня 2019

Благодаря @jasonharper.Документ Python в Lib / pathlib.py гласит: «Path.write_bytes (data) Откройте файл, указанный в байтовом режиме, запишите в него данные и закройте файл:«

, поэтому он открывается каждый раз.open (... 'wb') использует io.BufferedIOBase.

...