python的csv编写器不再支持二进制模式吗?
直到现在我还没有写'b'模式,我得到了非常烦人的错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-030fb0c9dc9a> in <module>()
4 with open('test.csv', 'wb') as f:
5 w = csv.writer(f)
----> 6 w.writerows(rows)
TypeError: a bytes-like object is required, not 'str'
代码:
import csv
rows = [b'1,2,3', b'4,5,6', b'7,8,9']
with open('test.csv', 'wb') as f:
w = csv.writer(f)
w.writerows(rows)
如果有人能够解释那个很棒的错误。我传入一个iterable,其中每个元素都是一个字节序列,但我仍然得到一个关于输入不是'bytes'而是'str'的错误。这种行为似乎出乎意料。
我知道如果我关闭二进制模式,上面的代码片段可以写入普通文件。如果任何人有一个建设性的解决方案或建议,我将非常感激。
答案 0 :(得分:5)
The csv
module in Python 3 always attempts to write strings, not bytes:
为了使与实现DB API的模块接口尽可能简单,将值None写为空字符串。 [...]所有其他非字符串数据在写入之前用str()进行字符串化。
这意味着你必须传递一个接受字符串的文件对象,这通常意味着在文本模式下打开它。
如果您遇到需要字节的文件对象,请将其包装在io.TextIOWrapper
中以处理str-&gt;字节编码:
# assuming you want utf-8
with io.TextIOWrapper(binary_file, encoding='utf-8', newline='') as text_file:
w = csv.writer(text_file)