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