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

时间:2018-12-14 09:04:01

标签: python ftp zip zipfile ftplib

我想从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尽可能低。

1 个答案:

答案 0 :(得分:1)

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