csv.writer写入含逗号字段需引号包裹,应显式指定encoding="utf-8-sig"防乱码,打开文件必加newline=""防空行,quoting推荐quote_minimal或quote_all。

csv.writer 写入带逗号的字段会错乱
直接用 csv.writer 写字符串,如果字段里本身含逗号(比如地址“北京市,朝阳区”),默认不加引号就会被当成分隔符,读出来就偏列。这不是 bug,是 CSV 规范要求:含特殊字符的字段必须用引号包裹。
- 默认
quoting=csv.QUOTE_MINIMAL,只对含逗号、换行、引号的字段加引号 - 别手动拼接字符串(如
f.write("a,b,c")),绕过csv.writer就失去转义能力 - 如果所有字段都可能含逗号/换行/引号,建议统一用
quoting=csv.QUOTE_ALL
写入中文时出现 UnicodeEncodeError
Windows 默认编码是 gbk,而 CSV 文件常需 UTF-8;不指定 encoding,open() 会用系统默认编码写入,遇到中文就报 UnicodeEncodeError: 'gbk' codec can't encode character。
- 务必显式传
encoding="utf-8"给open() - Excel 打开 UTF-8 CSV 可能乱码,可在开头加 BOM:
open(..., encoding="utf-8-sig") - Linux/macOS 下不加 BOM 一般没问题,但跨平台分发建议用
utf-8-sig
追加写入时多出空行(Windows 特有)
在 Windows 上用 csv.writer 追加写入(mode="a"),每调用一次 writerow() 就可能多一个空行。这是因为 csv.writer 自动写 \r\n,而文本模式下 Python 又把 \n 转成 \r\n,结果变成 \r\r\n。
- 解决方法:打开文件时加
newline=""参数,禁用通用换行符转换 - 正确写法:
open("data.csv", "a", newline="", encoding="utf-8-sig") - 这个参数在所有平台都该加,不是 Windows 专属习惯,而是 CSV 模块文档明确要求
用 writerows() 一次性写多行但数据类型不对
writerows() 接收的是可迭代对象(如 list、tuple),每个元素必须是「可迭代的字段序列」,比如 [["a","b"],["c","d"]]。如果误传 [["a","b","c"]](单个 list),它会被当成「一行、三个字段」,但若传 ["a","b","c"](没套一层),就会报 TypeError: a bytes-like object is required, not 'str'——因为 writerows() 把字符串当成了字节序列的迭代器。
立即学习“Python免费学习笔记(深入)”;
- 确认数据结构:外层是行列表,内层是字段列表或元组
- 避免直接传 pandas DataFrame.values —— 它返回 numpy.ndarray,某些版本下
writerows()不兼容,先转tolist() - 如果字段含
None,csv.writer会写成空字符串;要写成"NULL"或其他占位符,得提前处理
open(..., mode="w", newline="", encoding="utf-8-sig") + csv.writer(..., quoting=csv.QUOTE_MINIMAL)。BOM、换行、引号策略这三处,漏一个都可能让下游解析翻车。










