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