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())
When you extract files from a zipped folder, a new folder with the same name is created which contains the files. The compressed (zipped) version also remains.
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()}
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")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With