csv.writer 默认用 csv.QUOTE_MINIMAL 转义:仅当字段含逗号、引号或换行符时加双引号,并将内部引号转为两个双引号;必须配合 open(..., newline='') 使用,否则换行处理异常。

csv.writer 默认如何转义特殊字符
默认情况下 csv.writer 会自动处理字段中含逗号、引号、换行符(\n 或 \r\n)的情况:只要字段里出现这些字符,它就会把整个字段用双引号包裹,并对内部已有的双引号做转义(变成两个双引号 "")。这个行为由 quoting 参数控制,默认是 csv.QUOTE_MINIMAL。
这意味着:只有当字段含逗号、引号或换行时才加引号;纯数字或普通字母字符串不会被引号包围。
- 字段为
"apple, banana"→ 写入为"apple, banana" - 字段为
He said "Hi"→ 写入为"He said ""Hi""" - 字段含换行:
"line1\nline2"→ 写入为"line1\nline2"(注意:实际写入的是字面换行,不是\n字符串)
为什么有时引号没出现,或者转义失效
常见原因是手动拼接字符串后直接写入,绕过了 csv.writer 的转义逻辑。比如:
writer.writerow([f'"{name}"', age]) # 错误!不要自己加引号这会导致双重引号或引号未闭合。正确做法是把原始值原样传进去,让 writer 自己决定是否加引号和怎么转义。
- 别用
str.replace()或f-string手动处理引号 - 确保传入
writerow()的是 Python 字符串对象,不是已编码的 bytes - 如果字段来自用户输入或文件读取,确认没有提前 strip 掉末尾换行导致
\n残留
如何强制所有字段加引号
用 quoting=csv.QUOTE_ALL,这样每个字段无论内容如何都会被双引号包裹,且内部引号统一转义为 ""。适合需要强一致格式的场景(如与某些旧系统对接)。
writer = csv.writer(file, quoting=csv.QUOTE_ALL)
- 字段
abc→ 写入"abc" - 字段
a"b→ 写入"a""b" - 字段
a,b→ 写入"a,b"
注意:这会让 CSV 文件体积略大,但解析兼容性最好。
换行符写入失败或显示异常的根源
根本原因常是打开文件时没指定 newline=''。在 Windows 上,若用 open('x.csv', 'w') 而不加该参数,Python 的 universal newlines 机制会把 \n 自动转成 \r\n,而 csv.writer 又会把它当作字段内换行处理,导致嵌套引号或解析错误。
- 务必使用
open('out.csv', 'w', newline='')(写入)或open('in.csv', 'r', newline='')(读取) - 字段中真有换行符时,
csv.writer会保留它并包裹引号;但你看到的“空白行”或“错位”,大概率是编辑器渲染问题,不是数据损坏 - 用
csv.reader读回来时,换行符仍保持原样,无需额外解码
最易忽略的是 newline='' —— 它不是可选项,是 CSV 模块正常工作的前提。










