如何以二进制模式编写csv文件?

时间:2018-05-01 17:13:55

标签: python csv binary

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'的错误。这种行为似乎出乎意料。

我知道如果我关闭二进制模式,上面的代码片段可以写入普通文件。如果任何人有一个建设性的解决方案或建议,我将非常感激。

1 个答案:

答案 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)