为何pandas.read_excel()设置nrows=10无法加速读取XLSX文件?
问题原因与解决方案
你的推测完全正确——XLSX格式的结构导致pandas.read_excel()默认无法通过nrows参数提前终止读取,这也是设置nrows=10后耗时依然和读取全表一致的核心原因。
核心原因
XLSX是基于XML的压缩格式,工作表的所有数据被打包在一个连续的XML流中。pandas默认使用的openpyxl引擎,读取时会先完整解析整个工作表的XML内容到内存,再根据nrows参数截取前N行返回。也就是说,nrows只是在数据加载完成后做截断,并没有减少底层的解析工作量,所以耗时和读全表几乎无差。而CSV是行式文本格式,读取时可以读到指定行数就直接停止,因此nrows能有效提速。
快速读取指定行数的解决方案
1. 用openpyxl只读模式逐行读取(最高效)
直接借助openpyxl的只读模式,手动读取前N行,避免解析全表:
from openpyxl import load_workbook import pandas as pd # 以只读模式加载工作簿,避免加载全表到内存 wb = load_workbook("your_large_file.xlsx", read_only=True) ws = wb.active # 读取前10行(包含表头) rows = [] for idx, row in enumerate(ws.iter_rows(values_only=True)): rows.append(row) if idx >= 9: # 索引从0开始,取前10行就停在第9个索引 break # 转成DataFrame df = pd.DataFrame(rows[1:], columns=rows[0]) wb.close()
2. 结合chunksize参数分块读取
用pandas的chunksize分块读取,只取第一个块(即前N行):
# 设置chunksize等于你需要的行数 chunk_iterator = pd.read_excel("your_large_file.xlsx", chunksize=10) df = next(chunk_iterator) # 只获取第一个chunk,即前10行
这种方法利用pandas的分块迭代器,底层会逐块读取数据,比直接用nrows更高效。
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

