2013-08-27 12 views
12

Jak napisać plik zip w pamięci do pliku?Python, napisz w pliku zip do pliku

# 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() 

Odpowiedz

27

StringIO.getvalue zawartość powrót StringIO:

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

Alternatywnie, można zmienić położenie pliku przy użyciu seek:

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

Spróbuj następujący:

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

To daje mi "zipfile instancja ma atrybut 'getValue'" – user984003

+0

@ user984003, I uaktualniony kod. – falsetru

+0

@ user984003, Czy uruchamiasz ten kod w systemie Windows? Następnie musisz użyć trybu 'wb'. Zaktualizowałem kod. – 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 

W przypadku, gdy uszkodzony plik zip czyta i można zauważyć brakujące lub uszkodzone pliki dowiązania z niewłaściwych znaczników czasu, to może być fakt, że właściwości plików nie są uzyskiwanie skopiowane.

Powyższy fragment kodu jest sposobem rozwiązania problemu.

3
odpowiedź

Modyfikuj falsetru za python3

1) używa io.StringIO zamiast StringIO.StringIO

StringIO in python3

2) zastosowanie b"abc" zamiast "abc" lub

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

3) kodującego do binarnego Ciąg 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()) 

Powinno to również pracować dla gzip: How do I gzip compress a string in Python?