如何在Python 3中将CSV Writer与GZIP文件一起使用?

Win*_*ked 4 python csv python-3.x

我正在尝试将一些代码从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()
Run Code Online (Sandbox Code Playgroud)

问题是执行此操作会给我以下错误:

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
Run Code Online (Sandbox Code Playgroud)

我试过打开gzip文件为'w'而不是'wb',但无济于事.我猜测gzip模块需要一个字节数组,但CSV Writer不会或不会提供除字符串以外的任何内容.

人们如何在Python 3中做到这一点?

编辑:我应该提到这个代码块在Python 2.7中没有问题.

Kas*_*mvd 18

您需要将模式更改gzipwt:

fz = gzip.open(fn, 'wt')
Run Code Online (Sandbox Code Playgroud)

另外的一个鲜为人知的功能,gzip.open()并且bz2.open()是他们可以二进制模式打开现有文件的顶部分层.例如,这有效:

import gzip
f = open('somefile.gz', 'rb')
with gzip.open(f, 'rt') as g:
    text = g.read()
Run Code Online (Sandbox Code Playgroud)

这允许gzip和bz2模块使用各种类似文件的对象,如套接字,管道和内存中的文件.

  • 您应该使用`gzip.open(fn,'wt',newline ='')来打开写入,否则csv的换行符可能会受到损害(即:如果csv条目具有嵌入的换行符). (2认同)