下载zip文件并使用Python3将其解压缩到内存中

use*_*740 13 python python-3.x python-3.3 python-requests

我想从互联网上下载一个zip文件并将其解压缩.

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

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

如果你知道如何用urllib.request做这件事,我很想知道你是怎么做的.

use*_*740 33

我发现了怎么做:

request = requests.get(url)
file = zipfile.ZipFile(BytesIO(request.content))
Run Code Online (Sandbox Code Playgroud)

我错过了什么:

  • request.content 应该用来访问字节
  • io.BytesIO是正确的文件类对象bytes.

  • 为了让我自己更清楚地使用@ aonbyte的答案部分:`zipDocument = zipfile.ZipFile(io.BytesIO(request.content))`然后解压缩/保存它:`zipDocument.extractall()` (2认同)

aon*_*yte 5

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

import requests, zipfile, StringIO
response = requests.get(zip_file_url)
zipDocument = zipfile.ZipFile(StringIO.StringIO(response.content))
Run Code Online (Sandbox Code Playgroud)

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

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

zipDocment.extractall()
Run Code Online (Sandbox Code Playgroud)

  • -1,这在 Python 3 中不起作用 - StringIO 需要一个 str 而 `ZipFile` 和 `response.content` 都需要字节。`io.ByteIO` 是要使用的东西 (2认同)

Baz*_*Baz 5

这是另一种方法,可以节省您安装请求的时间:

    r = urllib.request.urlopen(req)
    with zipfile.ZipFile(BytesIO(r.read())) as z:
        print( z.namelist() )
Run Code Online (Sandbox Code Playgroud)

  • 我会给你一个赞,所以至少它不是 < 0,我认为这是一个很好的答案,虽然我更喜欢使用请求 :) (3认同)