如何用Python分块读取大型XLSX文件?(偏好使用Pandas)
分块读取大型Excel文件(Pandas实现)
Pandas的read_excel不像read_csv那样直接支持chunksize参数,但可以通过结合Excel引擎和迭代器的方式实现分块读取,避免一次性加载整个大文件。
方法1:基于openpyxl引擎逐块读取(适合超大型文件)
借助openpyxl的只读模式迭代行数据,分块转换为DataFrame处理,内存占用更低:
import pandas as pd from openpyxl import load_workbook # 以只读模式加载工作簿,减少内存开销 wb = load_workbook(filename='m.xlsx', read_only=True) ws = wb.active # 获取默认活动工作表,也可指定表名如wb['Sheet1'] chunk_size = 10000 # 定义每块读取的行数,可根据内存调整 header = [cell.value for cell in next(ws.iter_rows(min_row=1, max_row=1))] # 提取表头 # 逐块迭代读取数据 for start_row in range(2, ws.max_row + 1, chunk_size): end_row = min(start_row + chunk_size - 1, ws.max_row) # 读取当前块的行数据 chunk_rows = [] for row in ws.iter_rows(min_row=start_row, max_row=end_row): chunk_rows.append([cell.value for cell in row]) # 转换为DataFrame df_chunk = pd.DataFrame(chunk_rows, columns=header) # 在这里处理当前块数据,比如清洗、统计、写入数据库等 print(f"处理第{start_row-1}至{end_row-1}行数据") print(df_chunk.describe()) # 示例处理:打印块数据统计信息 wb.close()
方法2:结合pd.ExcelFile分块读取(适合中大型文件)
通过skiprows和nrows参数控制每次读取的范围,实现分块加载:
import pandas as pd chunk_size = 10000 file_path = 'm.xlsx' # 先获取文件总行数(含表头) with pd.ExcelFile(file_path) as xls: sheet_name = xls.sheet_names[0] total_rows = pd.read_excel(xls, sheet_name=sheet_name, usecols=[0]).shape[0] # 分块读取并处理 for skip_rows in range(0, total_rows, chunk_size): # 读取当前块数据:第一块保留表头,后续块跳过表头 df_chunk = pd.read_excel( file_path, sheet_name=sheet_name, skiprows=skip_rows, nrows=chunk_size, header=None if skip_rows != 0 else 0 ) # 非第一块手动设置表头 if skip_rows != 0: df_chunk.columns = pd.read_excel(file_path, sheet_name=sheet_name, nrows=0).columns # 处理当前块数据 print(f"处理第{skip_rows+1}至{min(skip_rows+chunk_size, total_rows)}行数据") print(df_chunk.head())
注意事项
- 需提前安装openpyxl引擎:
pip install openpyxl - 可根据自身内存情况调整
chunk_size,比如5000或20000行 - 处理完每块数据后,可通过
del df_chunk及时释放内存
内容的提问来源于stack exchange,提问作者muntazir halim
相关产品推荐
相关产品推荐

