pd.read_excel内存占用疑问及Excel分块读取替代方案咨询
分块读取大Excel文件为DataFrame的方案
关于pd.read_excel(nrows, skiprows, usecols)的内存占用
使用nrows、skiprows、usecols参数时,pandas不会将整个Excel文件加载到内存。它会通过底层引擎(如openpyxl、xlrd)仅读取指定的行和列,内存占用仅对应你实际读取的那部分数据。需要注意:
- 旧版xlrd(仅支持.xls格式)在部分场景下会读取整个工作表的结构,但数据本身不会全量加载;
- 多次调用
read_excel分块读取时,每次都会重新打开文件,会增加少量IO开销,但对内存影响可忽略。
替代分块方案
1. pandas循环分块读取
手动控制分块逻辑,先获取总行数再分批读取:
import pandas as pd # 获取表头和总行数 df_header = pd.read_excel('large_file.xlsx', nrows=0) total_rows = pd.read_excel('large_file.xlsx', usecols=[0]).shape[0] chunk_size = 10000 # 每批次读取10000行 for i in range(0, total_rows, chunk_size): chunk = pd.read_excel( 'large_file.xlsx', skiprows=i+1, # 跳过表头和已读取的行 nrows=chunk_size, columns=df_header.columns ) # 在此处处理当前分块数据,如写入数据库、统计分析等 process_chunk(chunk)
2. Dask DataFrame
Dask完全支持Excel文件,它会自动将文件分块,采用延迟计算模式,不会一次性加载全量数据到内存。使用示例:
import dask.dataframe as dd # 读取Excel文件,自动分块 ddf = dd.read_excel('large_file.xlsx', engine='openpyxl') # 执行延迟计算(如求均值),仅在调用compute()时实际运算 result = ddf['target_column'].mean().compute() # 按分块迭代处理 for chunk in ddf.partitions: pandas_df = chunk.compute() process_chunk(pandas_df)
注意:需提前安装依赖包pip install dask-excel openpyxl。
3. 底层Excel库逐行读取
用openpyxl只读模式逐行读取,手动构建DataFrame分块,内存占用极低:
from openpyxl import load_workbook import pandas as pd wb = load_workbook('large_file.xlsx', read_only=True) # 只读模式减少内存开销 ws = wb.active chunk_size = 10000 rows = [] for idx, row in enumerate(ws.iter_rows(values_only=True)): if idx == 0: columns = row # 提取表头 continue rows.append(row) if len(rows) >= chunk_size: chunk = pd.DataFrame(rows, columns=columns) process_chunk(chunk) rows = [] # 处理剩余未达分块大小的数据 if rows: chunk = pd.DataFrame(rows, columns=columns) process_chunk(chunk) wb.close()
内容的提问来源于stack exchange,提问作者zensei
相关产品推荐
相关产品推荐

