2015-08-18 6 views
16

ich den folgenden Code habe eine im Speicher Zip-Datei zu erstellen, die einen Fehler in Python läuft wirft 3.Python 3 im Speicher Zipfile Fehler. String-Argument erwartet, bekam ‚Bytes‘

from io import StringIO 
from pprint import pprint 
import zipfile 


in_memory_data = StringIO() 
in_memory_zip = zipfile.ZipFile(
    in_memory_data, "w", zipfile.ZIP_DEFLATED, False) 
in_memory_zip.debug = 3 

filename_in_zip = 'test_filename.txt' 
file_contents = 'asdf' 

in_memory_zip.writestr(filename_in_zip, file_contents) 

klar sein, dass dies nur ein Python 3 Problem. Ich kann den Code auf Python 2 gut ausführen. Um genau zu sein, verwende ich Python 3.4.3. Der Stack-Trace ist unten:

Traceback (most recent call last): 
    File "in_memory_zip_debug.py", line 14, in <module> 
    in_memory_zip.writestr(filename_in_zip, file_contents) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/zipfile.py", line 1453, in writestr 
    self.fp.write(zinfo.FileHeader(zip64)) 
TypeError: string argument expected, got 'bytes' 
Exception ignored in: <bound method ZipFile.__del__ of <zipfile.ZipFile object at 0x1006e1ef0>> 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/zipfile.py", line 1466, in __del__ 
    self.close() 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/zipfile.py", line 1573, in close 
    self.fp.write(endrec) 
TypeError: string argument expected, got 'bytes' 

Antwort

26

ZipFile schreibt seine Daten als Bytes, keine Strings. Das bedeutet, Sie werden BytesIO statt StringIO auf Python 3.

Die Unterscheidung zwischen Bytes verwenden und Strings ist neu in Python 3. Die six Kompatibilitätsbibliothek eine BytesIO Klasse für Python hat 2, wenn Sie Ihr Programm sein wollen kompatibel mit beiden.

+0

Das ist verwirrend, weil die Fehlermeldung vom OP das genau entgegengesetzte Problem impliziert. Er liefert einen String-Wert, da die Fehlermeldung den erwarteten Argumenttyp angibt. –

Verwandte Themen