Zip-файл не распознается при загрузке через FTP - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь создать скрипт, который будет загружать ZIP-файл и распаковывать его.

Я использую Python 2.7 на Windows Server 2016.

Я создал скрипт загрузки, похожий наэто:

ftp = FTP()
ftp.connect("***")
ftp.login("***","***")
ftp.cwd(ftppath)
ftp.retrbinary("RETR " + filename ,open(tempfile, 'wb').write)
ftp.quit()

и сценарий извлечения zip:

zip_ref = zipfile.ZipFile(tempfile, 'r')
zip_ref.extractall(localpath)
zip_ref.close()

Они работают независимо друг от друга.Значение: если я запустил скрипт извлечения на моем тестовом ZIP-файле, он извлечет файл.Также, если я запускаю сценарий FTP с моего сервера, он загрузит файл.

Однако!Если я запускаю сценарии вместе, то есть я загружаю файл с моего FTP-сервера и затем извлекаю его, он выдаст ошибку: «файл не является Zip-файлом».

Кто-нибудь, кто знает, почему это происходит?Я проверил следующее:

  • Правильная папка
  • Скачивание zip-файла, его распаковка и повторное сжатие (затем скрипт извлечет его)

РЕДАКТИРОВАТЬ

Я читал о байтах ввода-вывода и т. П., Но без какой-либо удачи в его реализации.

1 Ответ

0 голосов
/ 10 октября 2018

, вероятно, из-за этой плохой практики однострочно:

ftp.retrbinary("RETR " + filename ,open(tempfile, 'wb').write)

open(tempfile, 'wb').write не дает какой-либо гарантии относительно того, когда файл закрыт.Вы нигде не храните дескриптор, возвращенный open, поэтому вы не можете решить, когда close файл (и обеспечить полную запись на диск).

Таким образом, последняя часть файла может быть просто не записанана диск еще при попытке открыть его в режиме чтения.А цепочка загрузки + разархивирования может вызвать ошибку (когда 2 отдельных выполнения оставляют время для очистки и закрытия файла)

Лучше использовать менеджер контекста, например так:

with open(tempfile, 'wb') as f:
    ftp.retrbinary("RETR " + filename ,f.write)

так что файлсбрасывается и закрывается при выходе из блока with (конечно, выполните операции чтения файла за пределами этого блока).

...