从内存中的 FTP 下载 Zip 文件并解压缩

Posted

技术标签:

【中文标题】从内存中的 FTP 下载 Zip 文件并解压缩【英文标题】:Download Zip File From FTP in Memory and Unzip it 【发布时间】:2019-10-14 20:32:43 【问题描述】:

我正在尝试创建一个从内存中的 FTP 下载文件并将其返回的函数。在这种情况下,我正在尝试下载一个 zip 文件并解压缩它而不在本地写入文件,但我收到以下错误:

ValueError: I/O operation on closed file.

这是我当前的代码:

from io import BytesIO
from ftplib import FTP_TLS

def download_from_ftp(fp):
    """
    Retrieves file from a ftp
    """
    ftp_host = 'some ftp url'
    ftp_user = 'ftp username'
    ftp_pass = 'ftp password'

    with FTP_TLS(ftp_host) as ftp:
        ftp.login(user=ftp_user, passwd=ftp_pass)
        ftp.prot_p()
        with BytesIO() as download_file:
            ftp.retrbinary('RETR ' + fp, download_file.write)
            download_file.seek(0)
            return download_file

这是我尝试解压缩文件的代码:

import zipfile
from ftp import download_from_ftp

ftp_file = download_from_ftp('ftp zip file path')
with zipfile.ZipFile(ftp_file, 'r') as zip_ref:
    # do some stuff with files in the zip

【问题讨论】:

【参考方案1】:

通过将BytesIO 实例化为上下文管理器,它会在退出时关闭文件句柄,因此download_file 在返回给调用者时不再具有打开的文件句柄。

您可以简单地为实例化的BytesIO 对象分配一个用于返回的变量。变化:

with BytesIO() as download_file:

到:

download_file = BytesIO()

并消除块。

【讨论】:

以上是关于从内存中的 FTP 下载 Zip 文件并解压缩的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:在运行时在主包子目录中下载 zip 并解压缩

java 下载异地FTP中的zip文件

从 FTP 服务器上的 Zip 解压 csv 文件

liunx下把网站文件压缩为zip文件备份提供给ftp下载

怎么用PuTTY工具在Linux系统下把压缩文件解压到指定目录文件夹下?怎么写语句?

如果通过验证,AWS lambda 读取 zip 文件执行验证并解压缩到 s3 存储桶