应传sheet_name=None一次性读取所有Sheet并返回字典;切勿用0或字符串名误读单表;含特殊字符的Sheet名须先用pd.ExcelFile().sheet_names探查再使用。

用 pd.read_excel() 一次性读取所有 Sheet,但别直接传 sheet_name=0
默认只读第一个 Sheet 是常见误操作起点。想读多个或全部,必须显式指定 sheet_name 参数:None 表示读全部(返回 dict,key 是 sheet 名,value 是 DataFrame);传列表如 ['Summary', 'RawData'] 可按需加载指定几个。注意:传 0 或字符串名只会读一个,哪怕文件里有十个 Sheet。
遇到 Sheet 名含空格、特殊字符或中文,别硬写字符串名
Excel 自动命名的 Sheet(比如 “Sheet1 (2)”)或用户起的 “Q3 销售数据-备份” 这类名字,直接写进 sheet_name 容易因空格、括号、编码问题报 KeyError 或 XLRDError。稳妥做法是先用 pd.ExcelFile 探查真实名称:
xl = pd.ExcelFile("report.xlsx")
print(xl.sheet_names) # 输出真实 list,复制粘贴更安全返回的 sheet_names 是已解码、已清理的名称,直接用于 sheet_name=[...] 就不会错。
不同 Sheet 结构不一致?别用 concat 硬拼
比如一个 Sheet 是销售明细(10 列),另一个是汇总表(3 列 + 合计行),强行 pd.concat([df1, df2]) 会补 NaN、列对不齐、类型混乱。这时应该:
立即学习“Python免费学习笔记(深入)”;
- 单独处理每个 Sheet:用
skiprows、usecols、dtype分别适配结构 - 用
sheet_name=None读成字典后,再按 key 分支处理,而不是急着合并 - 真要合并且结构差异大,优先考虑加标识列:
df.assign(sheet="RawData"),保留来源线索
大文件卡死或内存爆掉?换引擎 + 分批读
openpyxl 引擎适合 .xlsx 且支持读写,但加载整张大 Sheet 时内存占用高;xlrd 已停更且不支持 .xlsx;odfpy 仅限 .ods。实际建议:
- 明确指定引擎:
engine="openpyxl"(.xlsx)或engine="xlrd"(仅 .xls) - 用
usecols限制列范围,比读全量再删列快得多 - 对超大 Sheet,改用
chunksize(仅openpyxl不支持,得换calamine或用openpyxl手动迭代行)
真正复杂场景下,Pandas 读 Excel 只是第一步,Sheet 名、结构、编码、空白行位置这些细节,往往比“怎么读”更决定后续能不能跑通。


















