优先试encoding='gbk'或'gb18030',因windows下excel/记事本导出的csv多为gbk编码,而pandas默认utf-8导致乱码;若gbk报错则换gb18030(gbk超集),linux/macos文件多为utf-8,但含bom时需用utf-8-sig。

用 pd.read_csv() 时乱码,优先试 encoding='gbk' 或 'gb18030'
Windows 上用 Excel 或记事本保存的 CSV,十有八九是 GBK 编码,但 Pandas 默认用 utf-8,一读就变 。直接报错还好,更常见的是中文显示为方块、问号或一堆乱字符,这时候别急着改文件,先换编码参数试读。
实操建议:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 先尝试
pd.read_csv("data.csv", encoding="gbk")—— 兼容性最好,覆盖大部分国产软件导出的 CSV - 如果报
UnicodeDecodeError: 'gbk' codec can't decode byte...,说明有超范围字(比如生僻姓名、emoji),换encoding="gb18030"(GBK 的超集,能解几乎所有中文字符) - Linux/macOS 下生成的文件大概率是
utf-8,但如果从 Windows 复制粘贴过内容,也可能混入 BOM,此时加encoding="utf-8-sig"自动跳过 BOM - 不确定编码时,别靠猜:用命令行快速检测,
file -i data.csv(Linux/macOS)或chcp+ 记事本另存为时看底部编码提示(Windows)
用 open() 手动解码再传给 pd.read_csv(),适合需要预处理或容错的场景
当文件里混了多种编码、某几行损坏、或者想跳过报错行时,pd.read_csv() 的 encoding 参数不够用。这时手动用 open() 控制解码过程更稳妥。
实操建议:
- 用
open("data.csv", "rb")以二进制打开,避免自动解码干扰 - 逐行用
.decode("gb18030", errors="ignore")解码(errors="ignore"跳过无法识别的字节,"replace"则替换成 ) - 把清理后的文本塞进
StringIO,再交给pd.read_csv(),例如:from io import StringIO<br>with open("data.csv", "rb") as f:<br> text = f.read().decode("gb18030", errors="ignore")<br>df = pd.read_csv(StringIO(text)) - 注意:这样会丢失原始换行/引号转义逻辑,仅适用于结构简单、无嵌套逗号的 CSV
encoding 错误导致 ParserError 或列数错乱,本质是换行符识别失败
乱码不总表现为文字异常——有时 pd.read_csv() 报 ParserError: Expected x fields in line y, saw z,或明明 5 列数据,读出来变成 1 列,这往往是编码错误让换行符 \r\n 或逗号 , 被错解成其他字节,导致解析器断行/分列失败。
实操建议:
- 用十六进制查看器(如 VS Code 安装 Hex Editor 插件)打开文件,搜
0d 0a(CRLF)或0a(LF),确认真实换行符;再对比用不同encoding读取后repr(df.iloc[0,0])输出,看是否出现'\x00'或异常'\r'残留 - 强制指定行结束符:加参数
lineterminator="\n"或"\r\n",配合正确encoding使用 - 若列名本身乱码,会导致
df.columns出现不可见字符,后续df["中文列名"]报KeyError,此时应先用df.columns.tolist()查看真实列名,再用位置索引(如df.iloc[:, 0])临时绕过
写入时也得统一编码,否则“读对了”但“再读又乱”
很多人读对了,用 df.to_csv("out.csv") 保存后,下次用 Excel 打开又乱码——因为 to_csv() 默认用 utf-8,而 Excel(尤其 Windows 版)默认按 ANSI(即 GBK)打开 UTF-8 文件,没带 BOM 就必然乱。
实操建议:
- 要让 Excel 正常打开,写入时加
encoding="utf-8-sig"(自动加 BOM)或"gbk" - 若下游是 Python 程序读取,坚持全链路
utf-8,写入时用encoding="utf-8",读取时也明确写encoding="utf-8",避免依赖环境默认值 - 别用
to_csv(..., index=False)就以为没问题——index 名称和列名一样受 encoding 影响,如果原 df.columns 是乱码读进来的,写出去还是乱的
str 操作出错或导出再乱码。编码问题从来不是单点操作,而是贯穿读、算、写的链条。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










