2012-06-06 22 views
29

如何提取一个zip到内存?提取zipfile到内存?

我尝试(上.getvalue()返回None):

from zipfile import ZipFile 
from StringIO import StringIO 

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

参见:https://stackoverflow.com/questions/5710867 – J0ANMM

回答

42

extractall提取到文件系统,所以你不会得到你想要的。要提取内存中的文件,请使用read方法。

如果你真的需要在内存中的全部内容,你可以这样做:

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

可能的原因:

1,本模块目前不支持多盘的ZIP文件。 (OR)
2.使用StringIO.getvalue()天气检查Unicode错误即将到来。

+0

号['extractall'](http://docs.python.org/库/ zipfile#zipfile.ZipFile.extractall)不会返回任何东西(呃,默认为'None'),这就是他得到的。 – mata

11

经常与档案工作我会建议制作一个工具,以舒适地处理内存档案。事情是这样的:

import zipfile 
import StringIO 

class InMemoryZip(object): 

    def __init__(self): 
     # Create the in-memory file-like object for working w/imz 
     self.in_memory_zip = StringIO.StringIO() 

    # 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 file. 
     f = file(filename, "wb") 
     f.write(self.read()) 
     f.close() 

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

的作品就像一个魅力