csv.reader本身不支持encoding参数,必须用open()以文本模式指定encoding='gbk'完成解码后再传入;写入时需用'w'模式配合encoding='gbk'和newline=''。

csv.reader 无法直接处理 GBK 编码,必须先用 open() 指定 encoding
Python 的 csv.reader 本身不接受 encoding 参数,它只处理已解码的字符串对象。如果你直接传入一个未解码的 GBK 字节流(比如用 open('file.csv', 'rb')),会报 TypeError: iterator should return strings, not bytes。正确做法是让 open() 先完成解码,再把文本流交给 csv.reader。
常见错误写法:
with open('data.csv', 'r') as f: # 默认 utf-8,读 GBK 文件会 UnicodeDecodeError
reader = csv.reader(f)
正确写法:
with open('data.csv', 'r', encoding='gbk') as f:
reader = csv.reader(f)
for row in reader:
print(row)
使用 csv.DictReader 时同样要显式指定 encoding
csv.DictReader 和 csv.reader 行为一致,底层也依赖已解码的文本流。如果 CSV 第一行是中文表头(如 姓名,年龄,城市),且文件是 GBK 编码,不指定 encoding='gbk' 就会解码失败或乱码。
注意事项:
- 表头字段名也会被解码为 str,所以后续用
row['姓名']才能正常取值 - 若文件带 BOM(如 Windows 记事本保存的 GBK),
encoding='gbk'通常能自动跳过;但极少数情况需改用encoding='utf-8-sig'—— 这说明文件实际是 UTF-8,不是 GBK - 不要尝试用
encoding='gb2312'替代gbk:虽然兼容,但遇到扩展汉字(如“镕”“珃”)可能报错
写入 GBK 编码 CSV 时,open() 的 mode 必须是 'w',不能是 'wb'
和读取对称,写入 GBK 文件时,csv.writer 也需要文本模式 + 显式编码。用 'wb' 模式会触发 TypeError: a bytes-like object is required, not 'str',因为 writer 期望写入字符串,而非字节。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
正确示例:
with open('output.csv', 'w', newline='', encoding='gbk') as f:
writer = csv.writer(f)
writer.writerow(['姓名', '年龄'])
writer.writerow(['张三', 25])
关键点:
-
newline=''必须保留,否则 Windows 下会多出空行(Python 会把 \n 转成 \r\r\n) - 不要省略
encoding='gbk',否则默认用 utf-8 写入,中文在 Excel 里打开就是乱码 - 如果写入内容含特殊字符(如逗号、换行符),
csv.writer会自动加引号,无需手动处理
遇到 'gbk' codec can't decode byte 0xa6 错误,大概率是文件实际编码不是纯 GBK
这个错误常出现在用记事本另存为“ANSI”时——Windows 中“ANSI”实际指当前系统区域对应的编码(中文 Windows 是 GBK,但某些 OEM 字体或老旧软件可能混入其他编码字节)。此时强行用 encoding='gbk' 会卡在某个字节上。
排查建议:
- 用
file -i data.csv(Linux/macOS)或 VS Code 底部状态栏查看真实编码 - 尝试
encoding='gb18030':它是 GBK 的超集,能兼容更多汉字和兼容性字节,且 Python 原生支持 - 临时容错读取:
open(..., encoding='gbk', errors='ignore')或errors='replace',但会丢失或替换异常字符,仅用于调试
真正稳妥的方式,是确认源头编码。GBK 不是万能编码,很多所谓“GBK 文件”其实是 UTF-8 带 BOM 或 GB18030,硬套 gbk 只会让问题延迟暴露。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










