2013-04-15 2 views
4

Я загружаю файлы на Python, используя ftplib, и до недавнего времени все, казалось, работало нормально. Я загружаю файлы как таковые:Python ftplib Corrupting Files?

До недавнего времени я загружал файлы, которые мне нужны, просто отлично, как и ожидалось. Теперь, однако, мои файлы, которые я загружаю, повреждены и содержат длинные строки мусора ASCII. Я знаю, что это не файлы, отправленные на FTP, из которых я их вытаскиваю, потому что у меня также есть скрипт Perl, который делает это успешно с того же FTP.

Если какая-либо дополнительная информация, вот что отладчик выдает в командной строке при загрузке файла:

enter image description here

Кто-нибудь сталкивался какие-либо проблемы с поврежденными содержимого файлов с помощью retrbinary() в ftplib Пайтона?

Я действительно застрял/расстроен и не сталкивался с чем-либо, связанным с возможной коррупцией здесь. Любая помощь приветствуется.

ответ

1

Я просто столкнулся с этим вопросом вчера, когда пытался скачивать текстовые файлы. Не уверен, что это то, что вы делали, но, поскольку вы говорите, что в нем есть мусор 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)) 
Смежные вопросы