本质是Excel文件编码或引擎不匹配,非文件损坏;.xlsx优先用engine="openpyxl",.xls需用xlrd

用 pandas.read_excel 读取时中文列名乱码或读成 Unnamed: 0
本质是 Excel 文件编码或引擎没对上,不是文件本身损坏。Windows 上默认保存的 .xlsx 一般没问题,但如果是从网页导出、旧版 WPS 或手动改后缀的 .xls 文件,openpyxl 或 xlrd 引擎可能 fallback 失败。
- 优先显式指定引擎:
pandas.read_excel("data.xlsx", engine="openpyxl")(.xlsx)或engine="xlrd"(仅限 .xls,注意xlrd>=2.0已不支持 .xlsx) - 如果列名出现
Unnamed: 0,大概率是表格上方有合并标题行或空行,加参数skiprows=2跳过;用header=1指定第二行为列名行 - 中文列名显示为乱码(如
b'\xe5\xa7\x93\xe5\x90\x8d'),说明底层用了二进制读取但没解码——这种情况极少出现在.xlsx,多见于用xlrd读老版.xls且未装xlrd==1.2.0兼容包;换openpyxl引擎基本解决
matplotlib.pyplot.plot 绘图后中文标签显示为方块
Matplotlib 默认字体不支持中文,不是代码写错了,是字体路径没配或字体缺失。Linux/macOS 和 Windows 的默认字体路径差异大,硬编码路径不可靠。
- 最稳做法:用
matplotlib.font_manager.FontProperties指定字体文件路径,比如simhei.ttf(Windows)或Heiti.ttc(macOS),然后传给plt.xlabel(..., fontproperties=font) - 更省事但需全局生效:在绘图前加两行:
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']和plt.rcParams['axes.unicode_minus'] = False(后者修复负号变方块) - 注意:如果脚本跑在无 GUI 环境(如服务器),
Agg后端不支持交互字体查找,必须用FontProperties+ 绝对路径,且字体文件得随脚本一起部署
自动化绘图时图表尺寸/分辨率糊、导出图片模糊
不是 DPI 设置越高越好,而是要匹配使用场景和输出设备。默认 figsize=(6.4, 4.8) 是屏幕显示尺寸,直接 plt.savefig 不设参数会按 100 DPI 输出,打印或 PPT 插入就发虚。
- 导出高清图必备三参数:
plt.savefig("plot.png", dpi=300, bbox_inches='tight', facecolor='white') -
bbox_inches='tight'防止坐标轴标签被截断,尤其加了中文标题后容易出这问题 - 如果导出 PDF 用于论文,把
dpi去掉,PDF 是矢量格式,缩放不失真;但注意中文字体要嵌入,否则换电脑打开变空白——用plt.rcParams['pdf.fonttype'] = 42(Type 42 = TrueType)
循环处理多个 Excel 文件时内存暴涨、程序卡死
常见原因是没释放 matplotlib figure 对象,每次 plt.figure() 或 plt.subplot() 都在内存里堆新图,几百个文件后 Python 进程吃光内存。
- 每轮绘图完必须显式关闭:
plt.close(fig)(推荐)或plt.close('all')(粗暴但有效) - 避免用
plt.plot(...)这种 stateful 接口,改用面向对象接口:fig, ax = plt.subplots(); ax.plot(x, y); fig.savefig(...); plt.close(fig) - 读 Excel 也别全塞进一个大 DataFrame:用
chunksize参数分块读(适合超大表),或用usecols只读需要的列,减少内存占用
事情说清了就结束。真正卡住的点往往不在语法,而在字体路径是否可访问、figure 是否被 close、DPI 和输出格式是否匹配——这些细节不报错,但结果就是“图出来了,但不对”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











