Extracting a zipfile to memory?

PythonMemoryZipStringioPython Zipfile

Python Problem Overview


How do I extract a zip to memory?

My attempt (returning None on .getvalue()):

from zipfile import ZipFile
from StringIO import StringIO

def extract_zip(input_zip):
    return StringIO(ZipFile(input_zip).extractall())

Python Solutions


Solution 1 - Python

extractall extracts to the file system, so you won't get what you want. To extract a file in memory, use the ZipFile.read() method.

If you really need the full content in memory, you could do something like:

def extract_zip(input_zip):
    input_zip=ZipFile(input_zip)
    return {name: input_zip.read(name) for name in input_zip.namelist()}

Solution 2 - Python

If you work with in-memory archives frequently, I would recommend making a tool. Something like this:

# Works in Python 2 and 3.

try:
    import BytesIO
except ImportError:
    from io import BytesIO  # Python 3
import zipfile


class InMemoryZip(object):
    def __init__(self):
        # Create the in-memory file-like object for working w/IMZ
        self.in_memory_zip = BytesIO()

    # Just zip it, zip it
    def append(self, filename_in_zip, file_contents):
        # Appends a file with name filename_in_zip and contents of
        # file_contents to the in-memory zip.
        # Get a handle to the in-memory zip in append mode
        zf = zipfile.ZipFile(self.in_memory_zip, "a", zipfile.ZIP_DEFLATED, False)

        # Write the file to the in-memory zip
        zf.writestr(filename_in_zip, file_contents)

        # Mark the files as having been created on Windows so that
        # Unix permissions are not inferred as 0000
        for zfile in zf.filelist:
            zfile.create_system = 0

        return self

    def read(self):
        # Returns a string with the contents of the in-memory zip.
        self.in_memory_zip.seek(0)
        return self.in_memory_zip.read()

    # Zip it, zip it, zip it
    def writetofile(self, filename):
        # Writes the in-memory zip to a physical file.
        with open(filename, "wb") as file:
            file.write(self.read())


if __name__ == "__main__":
    # Run a test
    imz = InMemoryZip()
    imz.append("testfile.txt", "Make a test").append("testfile2.txt", "And another one")
    imz.writetofile("testfile.zip")
    print("testfile.zip created")

Solution 3 - Python

Probable reasons:

1.This module does not currently handle multi-disk ZIP files. (OR)
2.Check with StringIO.getvalue() weather Unicode Error is coming up.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1438003View Question on Stackoverflow
Solution 1 - PythonmataView Answer on Stackoverflow
Solution 2 - PythonDeviaciumView Answer on Stackoverflow
Solution 3 - Pythondilip kumbhamView Answer on Stackoverflow