2012-06-06 43 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") 

的作品就像一個魅力