Python in-memory zip library

后端 未结 4 1059
逝去的感伤
逝去的感伤 2020-11-29 19:14

Is there a Python library that allows manipulation of zip archives in memory, without having to use actual disk files?

The ZipFile library does not allow you to upd

4条回答
  •  既然无缘
    2020-11-29 19:19

    From the article In-Memory Zip in Python:

    Below is a post of mine from May of 2008 on zipping in memory with Python, re-posted since Posterous is shutting down.

    I recently noticed that there is a for-pay component available to zip files in-memory with Python. Considering this is something that should be free, I threw together the following code. It has only gone through very basic testing, so if anyone finds any errors, let me know and I’ll update this.

    import zipfile
    import StringIO
    
    class InMemoryZip(object):
        def __init__(self):
            # Create the in-memory file-like object
            self.in_memory_zip = StringIO.StringIO()
    
        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()
    
        def writetofile(self, filename):
            '''Writes the in-memory zip to a file.'''
            f = file(filename, "w")
            f.write(self.read())
            f.close()
    
    if __name__ == "__main__":
        # Run a test
        imz = InMemoryZip()
        imz.append("test.txt", "Another test").append("test2.txt", "Still another")
        imz.writetofile("test.zip")
    

提交回复
热议问题