Загрузка файлов с ftp-сервера с использованием python, но файлы не открываются после загрузки - PullRequest
6 голосов
/ 03 апреля 2020

Я использую python для загрузки файлов с ftp-сервера, и я могу загрузить файлы, но когда я открываю файлы, они кажутся поврежденными или не открываются. Файлы, такие как песни или jpgs, работают нормально, но документы, Листы Excel, PDF-файлы и текстовые файлы загружаются неправильно.

Ниже приведен мой код:

from ftplib import FTP
ftp = FTP()
ftp.connect(ip_address,port)
ftp.login(userid,password)
direc='directory path'
ftp.cwd(direc)
doc='doc.txt' or xlsx or pdf or jpg etc
download_path='path to download file on desktop'
file=open(download_path+ doc,'wb')
ftp.retrbinary(f"RETR {doc}", file.write)

Я могу загрузить необходимые файлы, но большинство из них повреждены. Какие изменения я должен сделать, чтобы код работал.

Ответы [ 3 ]

5 голосов
/ 03 апреля 2020

не может проверить FTP в данный момент, но я вижу проблему с открытием и закрытием файла.

Опция A:

file=open(download_path + doc,'wb')  # add '+' to append instead of overwriting
...
...
file.close()

Опция B (менеджер контекста, полезен как он закрывает файл при завершении sh вверх:

with open(download_path + doc,'wb') as file:
    file.write(*args, **kwargs)

Относительно использования модуля ftplib, отличный ответ на следующий пост ftp.retrbinary () help python steveha .

Относительно открытия и записи в файл с помощью диспетчера контекста см. Как открыть файл с помощью оператора open with и обработки исключений (Python 3 документации) , как указано sir-snoopalot

Обратитесь также к документации ftplib для получения дополнительной информации.

Надеюсь, это поможет .

3 голосов
/ 03 апреля 2020

Я не пробовал ваш код, но, глядя на документацию Python, вы, возможно, забыли закрыть файл и правильно завершить работу, поэтому буфер файлов может быть не полностью записан на диск.

Попробуйте сделать следующее:

with open(download_path+ doc,'wb') as fp:
    ftp.retrbinary(f"RETR {doc}", file.write)

ftp.quit()

Оператор with будет выполнять функцию закрытия для файла при выходе из этого блока

0 голосов
/ 03 апреля 2020

Вы забыли закрыть свой файл. Просто добавьте следующее в конце вашего кода.

file.close()
...