【发布时间】:2015-01-28 03:07:42
【问题描述】:
我正在尝试将一些代码从 Python 2.7 移植到 Python 3。2to3 工具适用于基本语法和包更改,但现在我们遇到了一些奇怪的副作用。
我有以下代码块。它使用 gzip 模块打开一个临时文件名。
f = NamedTemporaryFile(delete=False)
f.close()
fn = f.name + '.gz'
os.rename(f.name, fn)
fz = gzip.open(fn, 'wb')
writer = csv.writer(fz, delimiter='\t', lineterminator=lt)
for row in table:
writer.writerow(row)
fz.close()
问题是执行此操作会出现以下错误:
File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/gzip.py", line 343, in write
self.crc = zlib.crc32(data, self.crc) & 0xffffffff
TypeError: 'str' does not support the buffer interface
我尝试将 gzip 文件打开为“w”而不是“wb”,但无济于事。我猜 gzip 模块需要一个字节数组,但 CSV Writer 不提供或不会提供除字符串以外的任何内容。
人们如何在 Python 3 中做到这一点?
编辑:我应该提到这个代码块在 Python 2.7 中执行没有问题。
【问题讨论】:
-
你应该在写模式下试试。 fz = gzip.open(fn, 'w', newline='')
-
不,我得到与上面相同的
ValueError。我正在考虑根据文档将其重构为包装在 TextIOWrapper 中的 GzipFile。他们在这方面不是很详细。 -
将模式改为
wt,而不是wb。 -
我添加评论作为答案! ;)
-
也可以使用
writer.writerows(table),不用自己迭代其他table
标签: python csv python-3.x