下载一个 zip 文件并使用 Python3 将其提取到内存中

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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() )

【讨论】:

我会给你一个赞成票,所以至少它不是

以上是关于下载一个 zip 文件并使用 Python3 将其提取到内存中的主要内容,如果未能解决你的问题,请参考以下文章

Java批量下载文件并zip打包

下载Ajax响应作为zip文件?

如何使用标头php下载zip文件而不将其保存在服务器上

如何将包含 zip 文件的 QBytesArray 加载到 QuaZip?

天蓝色 blob 存储中的 XLSX 文件作为 zip 文件下载

如何在 Swift 中从服务器下载 zip 文件?