Question

I would like to download a zip file from internet and extract it.

I would rather use requests. I don't want to write to the disk.

I knew how to do that in Python2 but I am clueless for python3.3. Apparently, zipfile.Zipfile wants a file-like object but I don't know how to get that from what requests returns.

If you know how to do it with urllib.request, I would be curious to see how you do it too.

Was it helpful?

Solution

I found out how to do it:

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

What I was missing :

  • request.content should be used to access the bytes
  • io.BytesIO is the correct file-like object for bytes.

OTHER TIPS

Here's another approach saving you having to install requests:

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

Using Requests, this can be done very simply.

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

Using String.IO you can make a file-like object for the responses content attribute.

If you want to extract to directory you can use the ZipFile's extractall() function

zipDocment.extractall()
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top