Python 如何以二进制模式写入csv文件?
python的csv编写器不再支持二进制模式了吗 到目前为止,我还没有在“b”模式下写作,我遇到了非常恼人的错误,比如:Python 如何以二进制模式写入csv文件?,python,csv,binary,Python,Csv,Binary,python的csv编写器不再支持二进制模式了吗 到目前为止,我还没有在“b”模式下写作,我遇到了非常恼人的错误,比如: --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-2-030fb0c9dc9a>
---------------------------------------------------------------------------
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'
如果有人能解释这个错误那就太好了。我传入了一个iterable,其中每个元素都是一个字节序列,但我仍然得到一个错误,输入不是“bytes”,而是“str”。这种行为似乎出乎意料
我知道如果我关闭二进制模式,上面的代码片段可以写入普通文件。如果任何人有建设性的解决方案或建议,我将非常感谢 :
为了尽可能方便地与实现DB API的模块进行接口,值None被写为空字符串。[…]所有其他非字符串数据在写入之前都使用str进行字符串化
这意味着您必须向它传递一个接受字符串的文件对象,这通常意味着以文本模式打开它
如果您遇到需要字节的文件对象,请将其包装为一个以处理str->bytes编码:
# assuming you want utf-8
with io.TextIOWrapper(binary_file, encoding='utf-8', newline='') as text_file:
w = csv.writer(text_file)
:
为了尽可能方便地与实现DB API的模块进行接口,值None被写为空字符串。[…]所有其他非字符串数据在写入之前都使用str进行字符串化
这意味着您必须向它传递一个接受字符串的文件对象,这通常意味着以文本模式打开它
如果您遇到需要字节的文件对象,请将其包装为一个以处理str->bytes编码:
# assuming you want utf-8
with io.TextIOWrapper(binary_file, encoding='utf-8', newline='') as text_file:
w = csv.writer(text_file)
python的csv编写器不再支持二进制模式了吗?对的Python3中的csv模块需要以文本模式打开输入和输出文件。请用实际文本替换这些图像好吗?请参阅@PM2Ring,谢谢您的评论。我很清楚将其添加为文本块的好处。只要我有5分钟的空闲时间,我就会马上修复。你能澄清一下为什么你必须有一个二进制文件吗?您正在写入与7位ASCII或UTF-8不兼容的数据吗?如果是这样,您可能需要使用另一种编码,例如拉丁文1。@PM2Ring它是一个只支持二进制写入模式的api接口。这不是我能控制的。坚持使用这个界面。下面由user2357112给出的答案效果很好,尤其是write_through=True标志,因此它只将所有内容发送到底层二进制文件句柄的缓冲区,并进行文本->二进制转换。python的csv编写器是否不再支持二进制模式?对的Python3中的csv模块需要以文本模式打开输入和输出文件。请用实际文本替换这些图像好吗?请参阅@PM2Ring,谢谢您的评论。我很清楚将其添加为文本块的好处。只要我有5分钟的空闲时间,我就会马上修复。你能澄清一下为什么你必须有一个二进制文件吗?您正在写入与7位ASCII或UTF-8不兼容的数据吗?如果是这样,您可能需要使用另一种编码,例如拉丁文1。@PM2Ring它是一个只支持二进制写入模式的api接口。这不是我能控制的。坚持使用这个界面。下面由user2357112给出的答案运行良好,特别是使用write_through=True标志,因此它只将所有内容发送到底层二进制文件句柄的缓冲区,并且只执行文本->二进制转换。二进制模式不采用换行符argument@ChristopherPisz:是的,但我正在将换行符参数传递给io.TextIOWrapper,不适用于以二进制模式打开原始文件的调用。io.TextIOWrapper不接受换行符参数。二进制模式不接受换行符argument@ChristopherPisz:是的,但我正在将换行符参数传递给io.TextIOWrapper,而不是以二进制模式打开原始文件的调用。io.TextIOWrapper不接受换行符参数。