csv必须遵守rfc 4180转义规则:含逗号、双引号或换行符的字段须用双引号包裹;写入时应使用csv.quote_all并指定utf-8-sig编码以兼容excel。

CSV 文件不是“用逗号分开的文本”就完事了——它有一套必须遵守的转义和包裹规则,否则 Excel 打开会错行、Python 读取会报 csv.Error: newline inside string、数据库导入会丢数据。
字段里有逗号、换行或双引号时,必须用双引号包裹
很多人以为只要字段含逗号才加引号,其实 RFC 4180 明确规定:只要字段含 ,、" 或 \r\n(换行),就必须用双引号包裹。否则解析器无法判断哪一个是分隔符、哪一个是内容本身。
- ✅ 正确:
"Zhang, San",28,"He said ""great"", and left." - ❌ 错误:
Zhang, San,28,He said "great", and left.→ 第二个逗号会被当成列分隔,直接切错 - ⚠️ 换行也一样:
"Alice"后跟\r\n是合法的,但没引号包裹就等于记录提前结束
Python 的 csv.writer 默认不加引号,得手动配 quoting
用 csv.writer 写中文 CSV 时,默认行为是“只在必要时加引号”,但很多场景下“必要”判断不准(比如含空格或制表符),结果导出后 Excel 一打开就错列。
- 安全写法:
writer = csv.writer(f, quoting=csv.QUOTE_ALL)→ 所有字段都加引号,最稳 - 兼容 Excel 中文环境:
f = open("data.csv", "w", encoding="utf-8-sig"),否则 Windows Excel 打开 UTF-8 无 BOM 文件必乱码 - 别用
str.replace(",", "...")手动拼接 —— 遇到双引号就崩,""转义逻辑根本没法手写
Excel 打开 UTF-8 CSV 乱码?不是编码问题,是缺 BOM
UTF-8 本身没错,但 Excel(尤其是 Windows 版)默认不识别纯 UTF-8,它靠文件开头三个字节 0xEF 0xBB 0xBF(即 BOM)来判断编码。没这个标记,就按 ANSI(如 GBK)硬解,中文全变问号。
- ✅ 解决:
open("out.csv", "w", encoding="utf-8-sig")——utf-8-sig会自动写 BOM - ❌ 不要:
encoding="utf-8"+ 手动写 BOM,容易重复或写错位置 - 注意:
utf-8-sig只影响写入,读取时仍要用utf-8(BOM 会被自动跳过)
真正难的从来不是“怎么写进 CSV”,而是“怎么让所有下游工具——Excel、MySQL LOAD DATA、Power BI、甚至另一个 Python 脚本——都按你预期的方式解析那一串引号和逗号”。一个没转义的双引号,就能让整列数据往后偏移一格,而且很难一眼看出来。










