Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python3中,在csv中写入io.BytesIO失败_Python_String_Python 3.x_Csv_Bytesio - Fatal编程技术网

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

在python3中,在csv中写入io.BytesIO失败,python,string,python-3.x,csv,bytesio,Python,String,Python 3.x,Csv,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 isinstan

我正在尝试编写与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
会创建错误呢


我不能只对Python2和Python3使用
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,bar\r\n'
<type 'str'>
'foo,bar\r\n'

b'foo,bar\r\n'
在Python2中,上面的代码打印出来

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

'foo,bar\r\n'

@tdelaney我的意思是我不确定StringIO和BytesIO是否会为源文本提供相同的表示(可能在
utf-8
中)。这就是为什么我尝试使用相同的输出对象类型。这是一个很好的解决方法,但是你知道为什么当str是字节格式时错误会要求“bytes”吗?我相信错误来自
BytesIO
对象——它抱怨它在预期
字节时传递了
str
。在Python3中,
str
不是“字节格式”。unicode
str
是一个代码点序列。但是我传递了一个str.encode()对象,实际上是一个bytes对象。那么问题出在哪里呢?这个错误说,
str
被传递了,但它没有被传递(只是谈论Python 3)。我无法重现您发布的错误,所以这只是一个猜测。什么是自我分隔符?它可能是一个
str
?是的,可能是这样,不过在编码分隔符之后,它说“分隔符必须是字符串,而不是字节”。