下载一个 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 而ZipFile
和 response.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.BytesIO
是 bytes
的正确类文件对象。
【讨论】:
我同意,我的表述是指某种黑魔法 :) 感谢您的精确! 嗨,这个解决方案是否也与 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 将其提取到内存中的主要内容,如果未能解决你的问题,请参考以下文章
如何将包含 zip 文件的 QBytesArray 加载到 QuaZip?