2013-08-27 87 views
12

如何在內存zipfile中寫入文件?的StringIOPython,寫入內存zip到文件

# Create in memory zip and add files 
zf = zipfile.ZipFile(StringIO.StringIO(), mode='w',compression=zipfile.ZIP_DEFLATED) 
zf.writestr('file1.txt', "hi") 
zf.writestr('file2.txt', "hi") 

# Need to write it out 
f = file("C:/path/my_zip.zip", "w") 
f.write(zf) # what to do here? Also tried f.write(zf.read()) 

f.close() 
zf.close() 

回答

27

StringIO.getvalue回報內容:

>>> import StringIO 
>>> f = StringIO.StringIO() 
>>> f.write('asdf') 
>>> f.getvalue() 
'asdf' 

或者,您可以使用seek更改文件位置:

>>> f.read() 
'' 
>>> f.seek(0) 
>>> f.read() 
'asdf' 

嘗試以下操作:

mf = StringIO.StringIO() 
with zipfile.ZipFile(mf, mode='w', compression=zipfile.ZIP_DEFLATED) as zf: 
    zf.writestr('file1.txt', "hi") 
    zf.writestr('file2.txt', "hi") 

with open("C:/path/my_zip.zip", "wb") as f: # use `wb` mode 
    f.write(mf.getvalue()) 

+0

這給了我 「的ZipFile實例沒有屬性 '的GetValue'」 – user984003

+0

@ user984003,我更新的代碼。 – falsetru

+0

@ user984003,你在Windows中運行這段代碼嗎?然後,你必須使用'wb'模式。我更新了代碼。 – falsetru

0
with ZipFile(read_file, 'r') as zipread: 
     with ZipFile(file_write_buffer, 'w', ZIP_DEFLATED) as zipwrite: 
      for item in zipread.infolist(): 
       # Copy all ZipInfo attributes for each file since defaults are not preseved 
       dest.CRC = item.CRC 
       dest.date_time = item.date_time 
       dest.create_system = item.create_system 
       dest.compress_type = item.compress_type 
       dest.external_attr = item.external_attr 
       dest.compress_size = item.compress_size 
       dest.file_size = item.file_size 
       dest.header_offset = item.header_offset 

在zip文件中讀取損壞的,並且發現丟失的符號鏈接或者有錯誤的時間戳損壞的文件的情況下,它可能是該文件的屬性沒有得到複製的事實。

上面的代碼片段是我如何解決這個問題。

3

修改falsetru的回答爲python3

1)使用io.StringIO代替StringIO.StringIO

StringIO in python3

2)使用b"abc"代替​​,或

python 3.5: TypeError: a bytes-like object is required, not 'str' when writing to a file

3)編碼二進制串str.encode(s, "utf-8")

Best way to convert string to bytes in Python 3?

import zipfile 
import io 
mf = io.BytesIO() 

with zipfile.ZipFile(mf, mode="w",compression=zipfile.ZIP_DEFLATED) as zf: 

    zf.writestr('file1.txt', b"hi") 

    zf.writestr('file2.txt', str.encode("hi")) 
    zf.writestr('file3.txt', str.encode("hi",'utf-8')) 


with open("a.txt.zip", "wb") as f: # use `wb` mode 
    f.write(mf.getvalue()) 

這也應該gzip的工作:How do I gzip compress a string in Python?