代码之家  ›  专栏  ›  技术社区  ›  Martin

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

  •  1
  • Martin  · 技术社区  · 6 年前

    我想从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 回复  |  直到 6 年前
        1
  •  1
  •   Martin Prikryl    6 年前

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