应优先使用encoding='utf-8-sig'读取excel导出的csv,它能自动跳过bom避免列名污染;若仍乱码,再根据真实编码尝试gbk、gb18030等,不可盲目用utf-8或latin-1。

Python 读取中文文件时出现 UnicodeDecodeError 或显示 字符,基本都是编码没对上,不是文件坏了,也不是 Python 不支持中文。
读取 CSV 文件时中文变问号或报错 UnicodeDecodeError
最常见原因是没指定 encoding,Python 默认用 utf-8,但 Excel 导出的 CSV 常是 gbk 或 gb2312;用错编码就会解码失败。
- 先试
pd.read_csv("data.csv", encoding="gbk"),多数国产软件导出的 CSV 都能打开 - 如果还报错,用
chardet探测:运行chardet.detect(open("data.csv", "rb").read(10000)),看返回的encoding字段建议值 - 实在不确定,加
errors="replace"或errors="ignore"强行读入(仅用于临时查看,会丢失部分字符)
用 open() 读写中文文本时内容错乱
open() 默认使用系统 locale 编码(Windows 上常是 cp936,即 gbk),但脚本可能在 Linux/macOS 运行,环境不一致就容易翻车。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 写文件必须显式指定
encoding="utf-8":with open("out.txt", "w", encoding="utf-8") as f: - 读文件优先用
utf-8,失败再试gbk,不要依赖默认值 - 避免用
"r"模式直接读二进制内容再手动 decode——容易漏掉 BOM 处理,open(..., encoding=...)已自动处理
从数据库或 API 拿到的中文变成乱码
这不是 Python 的锅,是连接层或传输协议没设对编码。比如 MySQL 连接没声明 charset="utf8mb4",或者 HTTP 响应头没带 Content-Type: text/html; charset=utf-8。
- PyMySQL/MySQLdb 初始化时加参数:
charset="utf8mb4",且确保表和字段也是utf8mb4字符集 - requests 获取响应后,别直接用
r.text,先看r.encoding是否正确;不对就手动设:r.encoding = "utf-8"或"gbk" - SQLite 默认支持 UTF-8,一般不用调,但若插入失败,检查是否用了
str.encode("latin1")类错误转换
字符串本身含 BOM 或混合编码导致清洗失败
有些 Excel 导出的 UTF-8 文件带 BOM(\ufeff),开头多出一个不可见字符;还有些日志文件里一行是 utf-8,下一行是 gbk,统一 decode 会崩。
- 用
content.strip("\ufeff")去 BOM,或直接用open(..., encoding="utf-8-sig")(utf-8-sig自动跳过 BOM) - 逐行读取时,对每行单独尝试解码:
line.decode("utf-8", errors="ignore") or line.decode("gbk", errors="ignore") - 别对整个大文件用
bytes.decode()后再 split(),容易因某一行编码异常导致整块失败
真正麻烦的不是“怎么转”,而是“哪一段该用哪种编码”——同一项目里 Excel、数据库、API、日志文件可能混用三四种编码,靠猜不行,得留日志记下每个数据源的实际编码,并在读取前做最小验证(比如检查前 100 字节是否包含典型 GBK 字节模式)。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










