首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从内存中的FTP下载Zip文件并解压缩

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

Stack Overflow用户
提问于 2019-10-15 04:32:44
回答 1查看 496关注 0票数 1

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

代码语言:javascript
复制
ValueError: I/O operation on closed file.

下面是我当前的代码:

代码语言:javascript
复制
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

下面是我尝试解压该文件的代码:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-15 04:41:44

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

您只需为实例化的BytesIO对象分配一个返回变量即可。更改:

代码语言:javascript
复制
with BytesIO() as download_file:

至:

代码语言:javascript
复制
download_file = BytesIO()

然后把积木压下来。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58383707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档