You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以二进制模式写入CSV文件?Python的csv writer是否不再支持二进制模式?

关于Python中二进制模式写入CSV文件的问题

你的问题核心在于Python 2和Python 3中csv模块的设计差异,咱们一步步拆解清楚:

为什么会触发TypeError?

在Python 3里,csv.writer是专门为文本模式的文件对象设计的——它会输出字符串(str类型),而你用'wb'模式打开的文件只接受字节(bytes类型),两者类型不匹配,自然就抛出了TypeError: a bytes-like object is required, not 'str'。

这和Python 2的行为完全不同:Python 2中str和bytes是混同的,所以二进制模式写CSV没问题,但Python 3做了严格的类型区分,这是报错的关键原因。

怎么正确处理二进制数据并写入CSV?

分两种场景给出解决方案:

1. 推荐方案:用文本模式写入(符合Python 3设计逻辑)

如果你的数据是字节(bytes)类型,先解码成字符串,再用文本模式打开文件写入:

import csv

# 假设你的行是字节类型
rows = [b'1,2,3', b'4,5,6']
# 解码为字符串,再拆分列(csv.writer需要的是列的列表,不是逗号分隔的字符串)
processed_rows = [row.decode('utf-8').split(',') for row in rows]

with open('test.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerows(processed_rows)

注意这里要加newline='',这是csv模块的硬性要求——它会自动处理不同平台的换行符,避免出现多余的空行。

2. 必须用二进制模式?用TextIOWrapper包装

如果因为特殊需求必须用二进制模式打开文件,可以用io.TextIOWrapper把二进制文件对象包装成文本对象,让csv.writer正常工作:

import csv
from io import TextIOWrapper

rows = [b'1,2,3', b'4,5,6']
processed_rows = [row.decode('utf-8').split(',') for row in rows]

with open('test.csv', 'wb') as f:
    # 包装二进制文件为文本对象,指定编码和换行符设置
    text_file = TextIOWrapper(f, encoding='utf-8', newline='')
    writer = csv.writer(text_file)
    writer.writerows(processed_rows)
    text_file.flush()  # 手动刷新缓冲区,确保内容写入文件

Python的csv writer还支持二进制模式吗?

严格来说,Python 3的csv.writer不再支持直接传入二进制模式打开的文件对象——这是有意为之的设计,因为CSV本质是文本格式,Python 3希望明确区分文本和二进制I/O,避免编码混乱。

如果你看到旧代码里用二进制模式写CSV,那大概率是Python 2的代码,迁移到Python 3时必须改成文本模式,或者用上面的包装方案。

内容的提问来源于stack exchange,提问作者yvanscher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:06:03