根本原因是编码不匹配:pandas默认用utf-8写入,而windows excel默认按gbk解析,导致utf-8中文被错误解码为乱码;解决方法是导出时指定encoding='utf-8-sig',自动添加bom使excel正确识别utf-8。

Windows系统下用pandas.to_csv()导出中文CSV,默认会乱码,根本原因是编码不匹配——Pandas默认用utf-8,而Excel(尤其是旧版)默认按gbk或gb2312打开。
为什么Excel打开CSV显示乱码?
不是Pandas写错了,是读取方(Excel)和写入方(Pandas)对字节解释不一致。UTF-8编码的中文在Excel里被当成GBK解码,每个汉字变成两个乱码字符,比如“测试”变成“娴嬪”。Mac或WPS通常能自动识别UTF-8,但Windows自带Excel几乎总是失败。
导出时指定encoding='utf-8-sig'
这是最稳妥的兼容方案:utf-8-sig会在文件开头写入BOM(Byte Order Mark),Excel看到\ufeff就明白这是UTF-8,不再瞎猜编码。
实操建议:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 永远优先用
df.to_csv("data.csv", encoding="utf-8-sig", index=False) - 不要用
encoding="utf-8"—— 没BOM,Excel大概率继续乱码 - 避免用
encoding="gbk"—— 虽然Excel能打开,但遇到生僻字(如emoji、繁体、日文)会报错UnicodeEncodeError: 'gbk' codec can't encode character
如果必须用GBK编码(比如对接老旧系统)
仅限明确要求GBK且数据纯中文简体的场景。注意以下风险:
- 含英文标点、数字、空格一般没问题,但含
¥、℃、①等Unicode字符时,to_csv(..., encoding="gbk")会直接抛异常 - 解决方法:先用
df.astype(str).applymap(lambda x: x.encode("gbk", errors="ignore").decode("gbk"))过滤掉不可编码字符(慎用,会丢数据) - 更安全的做法是改用
encoding="gb18030"—— 它是GBK超集,支持更多汉字,兼容性更好
别忽略index和line_terminator
这两个参数不影响编码,但常和乱码问题一起出现,导致误判:
-
index=True(默认)会在第一列加行号,若原数据已有ID列,容易多出一列,看着像“错位乱码” -
line_terminator="\r\n"在Windows上更稳妥;Linux/Mac用"\n"即可。若换行符异常,Excel可能把多行压成一行,误以为是编码问题
真正麻烦的不是选哪个编码,而是得同时确认:导出时用了什么encoding、打开工具用什么编码读、中间有没有被记事本二次保存过(记事本另存为时会偷偷改编码)。三者只要一个不匹配,就回到乱码起点。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










