2012-06-06 35 views
29

Làm cách nào để trích xuất một zip vào bộ nhớ?Trích xuất tệp nén sang bộ nhớ?

nỗ lực của tôi (trở về None trên .getvalue()):

from zipfile import ZipFile 
from StringIO import StringIO 

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

Xem thêm: https://stackoverflow.com/questions/5710867 – J0ANMM

Trả lời

42

extractall chiết xuất với hệ thống tập tin, do đó bạn sẽ không có được những gì bạn muốn. Để trích xuất một tệp trong bộ nhớ, hãy sử dụng phương thức read.

Nếu bạn thực sự cần toàn bộ nội dung trong bộ nhớ, bạn có thể làm một cái gì đó như:

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

lý do kiến:

1.This mô-đun hiện không xử lý đa đĩa file ZIP. (HOẶC)
2.Kiểm tra với StringIO.getvalue() thời tiết Lỗi Unicode sắp xuất hiện.

+0

số [ 'extractall'] (http://docs.python.org/ library/zipfile # zipfile.ZipFile.extractall) không trả lại bất cứ thứ gì (tốt, 'None' theo mặc định), và đó là những gì anh ta nhận được. – mata

11

Thường xuyên làm việc với lưu trữ, tôi khuyên bạn nên tạo một công cụ để làm việc thoải mái với các lưu trữ trong bộ nhớ. Một cái gì đó như thế này:

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

công trình như một say mê

Các vấn đề liên quan