excel文件本身不走文本编码流,加encoding参数必报错;中文乱码主因是后缀与格式不符、引擎选错或上游保存用非unicode编码。

直接说结论:Excel 文件(.xlsx/.xls)本身不走文本编码流,加 encoding 参数必报错,且对乱码毫无作用;所谓“中文乱码”,90% 是文件后缀与真实格式不符、引擎选错、或上游保存时就用了非 Unicode 编码。
确认是不是真在读 Excel 文件
很多人把 .csv 文件误当成 .xlsx 用 read_excel() 读——这是最常见源头。
- 用系统自带文件属性查看「实际类型」,或在终端运行:
file your_file.xlsx(Linux/macOS),看输出是否含CSV或text/plain - 如果后缀是
.xlsx但内容其实是 CSV 格式(比如用记事本另存为 → 选了“ANSI”或“UTF-8”没勾 BOM),必须改用pd.read_csv(),再配encoding - Windows 上双击打开文件,看左上角显示的是 Excel 还是记事本/Excel Online —— 后者大概率是假 Excel
读 .xlsx 时 sheet 名或单元格中文乱码
这通常不是 pandas 的问题,而是底层引擎对非 UTF-8 元数据解析失败。openpyxl 引擎比默认的 xlrd(已弃用)更稳,且不依赖系统 locale。
- 显式指定
engine="openpyxl":pd.read_excel("data.xlsx", engine="openpyxl") - 若仍乱码,检查是否装了旧版
openpyxl:pip install --upgrade openpyxl - 不要给
pd.ExcelFile()加encoding—— 它根本不接受这个参数,加了会报TypeError - 极端情况(如老财务系统导出的 Excel):用
openpyxl.load_workbook()手动加载,再逐 cell 取值,绕过 pandas 解析层
读 .xls 老格式时中文全变问号或方块
xlrd 从 2.0.0 版起彻底放弃 .xls 支持,而 1.x 版本对中文兼容差。别硬扛,换方案。
- 降级安装兼容版:
pip install xlrd==1.2.0(仅限 Python ≤ 3.9) - 更推荐转用
calamine引擎(快、轻、中文友好):pip install calamine-python,然后pd.read_excel("data.xls", engine="calamine") - 终极兜底:用 LibreOffice 命令行转成
.xlsx再读:soffice --headless --convert-to xlsx data.xls
日期列读成数字、中文日期解析失败
这不是乱码,是 pandas 没识别出 Excel 的日期语义。数值型日期(如 44562.0)和中文文本日期(如 "2022年1月1日")必须分别处理。
- 数值型日期:用
pd.to_datetime(df["日期"], unit="D", origin="1899-12-30", errors="coerce")—— 漏掉origin会导致所有日期偏移 2 天 - 中文文本日期:先确认原始值是不是字符串(
df["日期"].dtype == "object"),再用pd.to_datetime(..., format="%Y年%m月%d日") - 读取时就规避:加
converters={"日期": lambda x: pd.to_datetime(x, unit="D", origin="1899-12-30", errors="coerce")},避免后续清洗
最容易被忽略的一点:乱码往往不是读取阶段的问题,而是 Excel 文件在 Windows 上用「ANSI」(即 GBK)保存时,没嵌入任何编码标识,导致下游解析器只能猜——而 pandas 不猜,它直接按二进制结构交由引擎处理。所以真正要推动的,是让数据提供方统一用 UTF-8 编码保存 CSV,或用 Excel 原生「另存为 → Excel 工作簿(*.xlsx)」,而不是「另存为 → CSV(逗号分隔)」再改后缀。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











