2013-08-27 20 views
12

ファイルにメモリ内のzipファイルを書き込むにはどうすればよいですか? StringIOPython、メモリに書き込みzip to file

# 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()) 
zipファイルが破損して読み込み、あなたが間違ったタイムスタンプを持つ欠落しているシンボリックリンクまたは破損したファイルを気づく場合
+0

は、私は、コードを更新 – user984003

+0

user984003 @、 "ZIPファイルのインスタンスは、 'のgetValue' は属性を持っていません"。 – 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 

、ファイルのプロパティがコピーされ取得されていないという事実である可能性があります。

上記のコードスニペットは、私がどのように問題を解決したかを示しています。

3

のpython3

1のModify falsetruの答えは)b"abc"代わりに​​、又は

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

3)エンコードを使用io.StringIO代わりにStringIO.StringIO

StringIO in python3

2)を使用しバイナリへ文字列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?

関連する問題