【问题标题】:Download a zip file and extract it in memory using Python3下载一个 zip 文件并使用 Python3 将其提取到内存中
【发布时间】:2014-06-18 14:49:10
【问题描述】:

我想从网上下载一个 zip 文件并解压。

我宁愿使用请求。我不想写入磁盘。

我知道如何在 Python2 中做到这一点,但我对 python3.3 却一无所知。显然, zipfile.Zipfile 想要一个类似文件的对象,但我不知道如何从请求返回的内容中获取它。

如果你知道如何使用 urllib.request 来做,我也很想看看你是怎么做的。

【问题讨论】:

    标签: python python-3.x python-3.3 python-requests


    【解决方案1】:

    使用请求,这可以非常简单地完成。

    import requests, zipfile, StringIO
    response = requests.get(zip_file_url)
    zipDocument = zipfile.ZipFile(StringIO.StringIO(response.content))
    

    使用 String.IO,您可以为响应内容属性创建一个类似文件的对象。

    如果要解压到目录,可以使用 ZipFile 的 extractall() 函数

    zipDocment.extractall()
    

    【讨论】:

    • Python3中没有StringIO.StringIO。可以使用 io.StringIO。这在我的安装中惨遭失败。也许我的安装有问题:TypeError: initial_value must be str or None, not bytes
    • -1,这在 Python 3 中不起作用 - StringIO 需要一个 str 而 ZipFileresponse.content 都需要字节。 io.ByteIO 是要使用的东西
    • 答案和@dbr 的评论有错别字:应该是zipDocument.extractall()io.BytesIO。即zipfile.ZipFile(io.BytesIO(response.content))注意:无法编辑答案
    【解决方案2】:

    我发现了怎么做:

    request = requests.get(url)
    file = zipfile.ZipFile(BytesIO(request.content))
    

    我错过了什么:

    • request.content 应该用于访问字节
    • io.BytesIObytes 的正确类文件对象。

    【讨论】:

    • 我同意,我的表述是指某种黑魔法 :) 感谢您的精确!
    • 嗨,这个解决方案是否也与 python 2.7 兼容??
    • 为了让我自己更清楚地使用@aonbyte 的部分答案:zipDocument = zipfile.ZipFile(io.BytesIO(request.content)),然后提取/保存它:zipDocument.extractall()
    【解决方案3】:

    这是另一种无需安装请求的方法:

        r = urllib.request.urlopen(req)
        with zipfile.ZipFile(BytesIO(r.read())) as z:
            print( z.namelist() )
    

    【讨论】:

    • 我会给你一个赞成票,所以至少它不是
    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2013-01-09
    • 2016-01-26
    • 2011-10-26
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    相关资源
    最近更新 更多