我正在尝试编写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中,上面的代码打印出来
b'foo,bar\r\n'
在Python2中,上面的代码打印出来
'foo,bar\r\n'
标签:python,python-3-x,string,csv,bytesio