写csv时中文乱码需用encoding='utf-8-sig';dictwriter需显式指定fieldnames且注意键名一致;open()必须加newline=''避免空行;csv模块自动处理引号转义,勿手动拼接。

csv.writer 写入时中文乱码怎么办
Windows 默认用 gbk 编码打开 CSV,但 Python 3 的 open() 默认用 utf-8,不显式指定编码就会在 Excel 里显示乱码。
- 写入时必须加
encoding='utf-8-sig':UTF-8 加 BOM 才能让 Excel 正确识别 - 别用
encoding='utf-8'—— Excel 会当它是 ANSI - 别依赖系统默认编码,哪怕测试时看似正常,换台机器就崩
示例:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
import csv
with open('data.csv', 'w', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f)
writer.writerow(['姓名', '城市'])
writer.writerow(['张三', '杭州'])
csv.DictWriter 写字典时字段顺序错乱或报错 KeyError
DictWriter 不自动推断字段名,也不按字典插入顺序写——它严格依赖你传给 fieldnames 的列表顺序。
- 字段名必须和字典键完全一致(大小写、下划线都不能差)
- 如果字典里有额外 key,要设
extrasaction='ignore',否则直接抛ValueError - 如果某些行缺 key,对应列会空着,不会报错;但若设了
restval='N/A',就能填默认值
示例:
import csv
rows = [{'name': '李四', 'city': '北京'}, {'name': '王五'}]
with open('dict.csv', 'w', encoding='utf-8-sig', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['name', 'city'], restval='未知')
writer.writeheader()
writer.writerows(rows)
写入 CSV 时换行符异常或空行增多
根本原因是没传 newline='' 给 open()。Windows 下 csv.writer 本身会写 \r\n,而 Python 的文本模式又会把 \n 自动转成 \r\n,结果变成 \r\r\n,Excel 就多出空行。
- 所有写 CSV 的
open()都必须带newline='' - 这个参数和编码无关,也不能省略或填
None - 读 CSV 时不用加它,只写需要
用 csv 模块处理含逗号、换行符的字段会出错
CSV 标准规定:字段含逗号、双引号或换行符时,必须用双引号包裹,且内部双引号要转义为两个双引号。但很多人手动拼字符串,结果 Excel 打开后列错位。
-
csv.writer和csv.DictWriter默认就做这些转义,别自己str.replace() - 不要用
print(..., file=f)直接写,那等于裸字符串输出 - 如果字段本身以双引号开头结尾,
csv模块仍会再包一层,并转义内层引号 —— 这是正确行为,不是 bug
比如 writer.writerow(['a,b', 'line1\nline2']) 会被安全写成:"a,b","line1<lf>line2"</lf>(其中 <lf></lf> 是实际换行符)
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










