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



我想从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()

最新更新