Получить файл с FTP и напрямую записать в zip-архив - PullRequest
0 голосов
/ 14 декабря 2018

Я хочу скачать файлы с FTP-сервера и заархивировать их локально в (zip) архив.

Хорошо известно, как загружать файлы и сохранять их по отдельности:

import ftplib
remote = ftplib.FTP(ftp_server) 
remote.login(username, password) 
for filename in file_list:
    remote.retrbinary("RETR " + filename, open(filename, 'wb').write)
remote.quit()

Также хорошо известно, как добавлять файлы в архив:

import zipfile
archive = zipfile.ZipFile(archive_file)
archive.write(filename)
archive.close()

Но кажется невозможным использовать оба одновременно:

remote.retrbinary("RETR " + filename, archive.write(filename))

Это приводит к ошибке FileNotFoundError, поскольку filename не был сохранен в локальном (временном) каталоге между ними.

Есть ли способ напрямую отправить поток файлов с FTP в zip-архив?Или было бы более эффективно загружать все файлы напрямую, добавлять их в архив, а затем удалять файлы?Я хотел бы, чтобы ввод-вывод жесткого диска был как можно ниже.

1 Ответ

0 голосов
/ 14 декабря 2018

Загрузите файл в память и используйте ZipFile.writestr:

import ftplib
import zipfile
from io import BytesIO

# ...

archive = zipfile.ZipFile(archive_file, "w")

for filename in file_list:
    flo = BytesIO()
    ftp.retrbinary('RETR ' + filename, flo.write)
    archive.writestr(filename, flo.getvalue())

archive.close()
...