openpyxl必须显式设置read_only=True才能启用SAX流式解析,否则全量加载XML导致内存暴增;pandas.read_excel()需用usecols、chunksize和calamine引擎优化,超大文件应转CSV或改用Parquet。

因为默认全量加载 XML 结构到内存,100MB 文件可能吃掉 2GB 内存,不是卡,是系统在拼命 swap 或直接抛 MemoryError。
openpyxl.read_only=True 为什么必须加?
不加就等于让 Python 把整个 .xlsx(本质是 ZIP 包)解压、解析所有 XML 节点、重建单元格对象树——哪怕你只取 A1 单元格。加了之后改用 SAX 流式解析,边读边扔,内存占用从 GB 级降到百 MB 级。
常见错误现象:load_workbook() 卡住 30 秒以上、任务管理器里 Python 进程内存飙升、报错 xml.etree.ElementTree.ParseError: out of memory
- 必须显式传
read_only=True,openpyxl 不会自动判断文件大小 - 启用后
ws.max_row和ws.max_column会强制全表扫描,拖慢 5–10 倍,别碰 -
ws.iter_rows(values_only=True)是安全的;但list(ws.iter_rows())会立刻爆内存 - 关闭工作簿要调
wb.close(),否则底层 XML 解析器不释放资源
pandas.read_excel() 怎么避免一次性加载?
它底层多数时候还是调 openpyxl,所以同样会全量加载——除非你主动切分。关键不是“能不能读”,而是“要不要全读”。
立即学习“Python免费学习笔记(深入)”;
librosa 是一个用于音频和音乐分析的 Python 库。它提供了特征提取、频谱分析、节拍跟踪、起始检测和音频可视化的工具,基于 NumPy 和 SciPy 构建,用于科学音频计算。
使用场景:你只需要其中几列做清洗或导出,其他几十列全是空或日志字段
- 用
usecols限定列,支持列表(如[0, 2, 4])或列名(如['id', 'amount']),跳过解析无关列 - 设
chunksize=5000,返回TextFileReader对象,for 循环逐块处理,每块用完即丢 - 搭配
dtype指定类型,比如把全数字列设成dtype={'amount': 'int32'},省一半内存 - 别用
engine='openpyxl'读超大文件——它比默认 engine 更重;engine='calamine'(需 pip install calamine-python)更快更省内存
超过 500MB 的 Excel 还硬要读怎么办?
这时候已不是“优化”,而是“绕开”。Excel 格式本身就不适合大数据,强行读只是给内存找茬。
性能影响:用 openpyxl 流式读 1GB 文件约需 2–3 分钟;转成 CSV 后用 pd.read_csv() 可能只要 20 秒
- 先用
openpyxl(read_only)+csv.writer抽出纯数据,导出为 CSV,再交给 pandas 处理 - 如果文件含公式或样式且必须保留,换 Java 生态的
Apache POI XSSF and SAX,Python 绑定少但稳定 - 终极方案:说服上游改用 Parquet 或数据库导出,Excel 只作最终交付格式,不作中间数据载体
最容易被忽略的一点:read_only=True 模式下 row 是 tuple,不是 dict,写 row['name'].value 会直接报 TypeError ——得先用首行定位索引,再按位置取值。

















