Python 3 内存 Zipfile 错误。预期的字符串参数,得到“字节”

我有以下代码来创建一个内存 zip 文件,该文件在 Python 3 中运行时会引发错误。

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)
需要明确的是,这只是一个 Python 3 问题。我可以在 Python 2 上正常运行代码。确切地说,我使用的是 Python 3.4.3。堆栈跟踪如下:

Traceback (most recent call last):
File "in_memory_zip_debug.py", line 14, in
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: >
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'

已邀请:
ZipFile将其数据写入字节,而不是字符串。这意味着您必须在 Python 3 上使用BytesIO而不是StringIO。

字节和字符串之间的区别在 Python 3 中是新的。如果您希望您的程序与两者兼容,则六兼容库有一个BytesIO适用于 Python 2的类。

要回复问题请先登录注册