在python3中写信给CSV中的io.bytesio失败



我正在尝试编写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'

但是断言的类型没有问题,那么为什么csv创建错误?

我不能仅适用于Python 2和3的BytesIO吗?这里的问题在哪里?

在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,barrn'

在Python2中,上面的代码打印

<type 'str'>
'foo,barrn'

相关内容

  • 没有找到相关文章

最新更新