【发布时间】: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 转换。