应优先用pandas.read_excel(..., chunksize=50000, engine="openpyxl")流式读取大xlsx文件;若需精细控制或读xls,改用openpyxl(read_only=True)或降级xlrd==1.2.0;pyxlsb仅适用于真xlsb文件。

用 pandas.read_excel 的 chunksize 参数流式读取
当 Excel 文件超过 100MB 或行数超百万时,直接 pd.read_excel() 极易内存溢出。根本解法不是换库,而是启用分块读取——chunksize 参数让 pandas 按指定行数返回迭代器,每次只加载一块数据到内存。
注意:chunksize 仅对 .xlsx 有效(依赖 openpyxl 引擎),.xls 不支持;且不能和 usecols、skiprows 等部分参数混用(会报 ValueError: chunksize not supported for this engine)。
- 推荐写法:
pd.read_excel("data.xlsx", chunksize=50000, engine="openpyxl") - 每块是
DataFrame,可立即处理(如过滤、聚合),无需缓存全部数据 - 若需跳过前几行,改用
skiprows+nrows配合循环定位,而非依赖chunksize自动对齐
用 openpyxl 直接读单元格,绕过 pandas 解析开销
如果只需要读某几列、某几行,或做条件查找(比如“找到第 3 列值为 'ERROR' 的所有行号”),用 openpyxl 原生 API 更快更省内存——它不构建 DataFrame,只按需加载单元格值。
关键点:必须设 read_only=True,否则 openpyxl 会预加载整张表的样式和公式,内存占用翻倍甚至崩溃。
立即学习“Python免费学习笔记(深入)”;
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
- 打开方式:
from openpyxl import load_workbook; wb = load_workbook("data.xlsx", read_only=True) - 读某行某列:
ws = wb.active; cell_value = ws.cell(row=1000, column=5).value - 遍历某列(推荐):
for row in ws.iter_rows(min_col=3, max_col=3, min_row=2): print(row[0].value) - 关闭工作簿:
wb.close()(read_only=True下必须显式调用,否则文件句柄不释放)
用 xlrd 读旧版 .xls 文件时的内存陷阱
xlrd 从 2.0 版起**只支持 .xls**,且默认把整个文件载入内存。对大 .xls 文件,即使只读一列,也会 OOM。
唯一缓解方式是升级到 xlrd==1.2.0(最后支持 .xlsx 的版本),并配合 formatting_info=False 和 ragged_rows=True 减少解析负担——但这仍是权宜之计,强烈建议将老 .xls 转成 .xlsx 后改用 openpyxl。
- 错误示范:
xlrd.open_workbook("big.xls")→ 内存暴涨 - 能省一点是一点:
xlrd.open_workbook("big.xls", formatting_info=False, ragged_rows=True) - 真正出路:用
convertxls.py或 LibreOffice 批量转格式,再切回openpyxl流式读
为什么不用 pyxlsb?它只解决一种格式
pyxlsb 是专为二进制 .xlsb 文件设计的库,读取速度确实比 openpyxl 快 3–5 倍,但前提是你的文件真是 .xlsb 格式——绝大多数所谓“大 Excel”其实是 .xlsx。
误用后果:pyxlsb 无法打开 .xlsx,会抛出 XlsbError: Invalid file format;而强行转换格式可能损坏公式或宏。
- 确认格式:
file -b data.xlsx输出应含Zip archive data,不是XLSB - 只在明确知道是
.xlsb且已安装pyxlsb时才用:from pyxlsb import open_workbook; wb = open_workbook("data.xlsb") - 别为了“听起来快”就引入新依赖,
openpyxl+chunksize已覆盖 95% 场景
最常被忽略的是引擎选择和 read_only 开关——同一份 .xlsx,用 openpyxl 默认模式 vs read_only=True,内存差 8 倍以上。别急着写逻辑,先检查 engine 和开关状态。

















