从 FTP 中检索文件并直接写入 zip 存档

Retrieve file from FTP and directly write into a zip archive

我想从 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 存档中?或者直接下载所有文件,将它们添加到存档中,然后删除文件会更有效吗?我想保持硬盘 I/O 尽可能低。

下载文件到内存并使用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()