【问题标题】:How to write a csv file in binary mode?如何以二进制模式编写csv文件?
【发布时间】:2018-05-03 16:19:32
【问题描述】:

python 的 csv writer 不再支持二进制模式了吗?

直到现在我才不得不在 '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)

如果有人能解释错误,那就太好了。我传入了一个迭代,其中每个元素都是一个字节序列,但我仍然收到一个错误,即输入不是“字节”而是“str”。这种行为似乎出乎意料。

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

【问题讨论】:

  • "python 的 csv writer 不再支持二进制模式了吗?"正确的。 Python 3 中的csv 模块需要以文本模式打开输入和输出文件。
  • 您能用实际文本替换这些图像吗?请看Why may I not upload images of code on SO when asking a question?
  • @PM2Ring 感谢您的评论。我很清楚将其添加为文本块的好处。只要我有 5 分钟的空闲时间,我就可以解决问题。
  • 你能解释一下为什么你必须有一个二进制文件吗?您是否正在编写与 7 位 ASCII 或 UTF-8 不兼容的数据?如果是这样,您可能需要使用其他编码,例如 Latin1。
  • @PM2Ring 是一个api接口,只支持二进制写入模式。不是我能控制的。卡在这个界面上。 user2357112 下面的答案效果很好,特别是使用 write_through=True 标志,所以它只是将所有内容发送到底层二进制文件句柄的缓冲区,并且只是进行 text->binary 转换。

标签: python csv binary


【解决方案1】:

The csv module in Python 3 always attempts to write strings, not bytes:

为了尽可能轻松地与实现 DB API 的模块进行交互,值 None 被写为空字符串。 [...] 所有其他非字符串数据在写入之前都使用 str() 进行字符串化。

这意味着你必须向它传递一个接受字符串的文件对象,这通常意味着以文本模式打开它。

如果您遇到需要字节的文件对象,请将其包装在 io.TextIOWrapper 中以处理 str->字节编码:

# assuming you want utf-8
with io.TextIOWrapper(binary_file, encoding='utf-8', newline='') as text_file:
    w = csv.writer(text_file)

【讨论】:

  • 二进制模式不接受换行参数
  • @ChristopherPisz:是的,但我将newline 参数传递给io.TextIOWrapper,而不是传递给以二进制模式打开原始文件的调用。 io.TextIOWrapper 确实采用换行参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2021-12-20
  • 2017-09-21
相关资源
最近更新 更多