Extracting a zipfile to memory?

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())

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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()}

Method 2

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")

Method 3

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.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x