在 csv 中写入 io.BytesIO 在 python3 中失败

Writing to io.BytesIO in csv fails in python3

我正在尝试编写 python 2/3 兼容代码以将字符串写入 csv 文件对象。此代码:

line_as_list = [line.encode() for line in line_as_list]
writer_file =  io.BytesIO()
writer = csv.writer(writer_file, dialect=dialect, delimiter=self.delimiter)
for line in line_as_list:
    assert isinstance(line,bytes)
    writer.writerow(line)

在 Python3 上出现此错误:

>           writer.writerow(line)
E           TypeError: a bytes-like object is required, not 'str'

但是 assert 类型没有问题,那么为什么 csv 会产生错误?

我不能只对 Python 2 和 3 使用 BytesIO 吗?哪里出了问题?

In Python3 csv.writer 需要一个以文本模式打开的类文件对象。 在 Python2 中,csv.writer 需要一个以二进制模式打开的类似文件的对象。

因此,在 Python3 中使用 io.StringIO,而在 Python2 中使用 io.BytesIO:

import io
import csv
import sys
PY3 = sys.version_info[0] == 3

line_as_list = [u'foo', u'bar']
encoding = 'utf-8'

if PY3:
    writer_file =  io.StringIO()
else:
    writer_file =  io.BytesIO()
    line_as_list = [line.encode(encoding) for line in line_as_list]

writer = csv.writer(writer_file, dialect='excel', delimiter=',')
writer.writerow(line_as_list)
content = writer_file.getvalue()

if PY3:
    content = content.encode(encoding)

print(type(content))
print(repr(content))

在 Python3 上面的代码打印出

<class 'bytes'>
b'foo,bar\r\n'

在 Python2 上面的代码打印出

<type 'str'>
'foo,bar\r\n'