openpyxl.load_workbook与pandas.read_excel的差异及转DataFrame方法
Excel读取速度差异与工作表转DataFrame解决方案
为什么第二种方法速度快这么多?
没错,核心原因就是第一种方法每次读取工作表都会重复打开并解析整个工作簿。
当你调用pd.read_excel()指定单个工作表时,pandas底层会让openpyxl完整加载整个Excel文件,解析完成后提取目标工作表的数据,随后关闭文件。循环读取12个工作表,就等于对同一个文件做了12次“打开-解析-关闭”的全流程操作,磁盘IO和重复解析的开销叠加起来,在大量文件的场景下自然耗时惊人。
而第二种方法里,openpyxl.load_workbook()只执行一次,一次性把整个工作簿加载到内存中。后续切换工作表只是直接访问内存里的已加载对象,完全不需要再读取磁盘文件。再加上你启用的两个参数:
read_only=True:让openpyxl以只读模式加载,跳过了格式渲染、编辑支持等非必要操作,大幅降低解析耗时;data_only=True:只读取单元格的计算结果,不加载公式,进一步减少了需要处理的数据量。
这些优化共同让速度提升了一个量级。
如何将openpyxl工作表转为pandas DataFrame?
根据你的需求,有几种实用方法:
1. 手动提取指定数据(适合按需读取)
如果只需要工作表中的部分行/列,手动遍历单元格构建数据更高效:
import pandas as pd from openpyxl import load_workbook wb = load_workbook(file_path, data_only=True, read_only=True) ws = wb['sheet1'] # 示例:第2行是表头,第3行及以下是数据 headers = [cell.value for cell in ws[2]] data_rows = [] for row in ws.iter_rows(min_row=3, values_only=True): data_rows.append(row) df = pd.DataFrame(data_rows, columns=headers)
2. 直接转换整个工作表
如果需要读取完整工作表,可以直接把工作表的行数据传入DataFrame:
ws = wb['sheet2'] # iter_rows(values_only=True)返回每行的单元格值元组 # 假设第1行是表头 df = pd.DataFrame(ws.iter_rows(values_only=True), columns=[cell.value for cell in ws[1]]) # 无表头的话直接去掉columns参数:df = pd.DataFrame(ws.iter_rows(values_only=True))
3. 折中方案:用pd.ExcelFile减少重复加载
要是想保留pandas的便捷性,又不想手动处理单元格,可以用pd.ExcelFile先加载一次工作簿,再读取多个工作表,同样能避免重复打开文件:
xls = pd.ExcelFile(file_path, engine='openpyxl') df_sheet1 = pd.read_excel(xls, sheet_name='sheet1') df_sheet2 = pd.read_excel(xls, sheet_name='sheet2')
内容的提问来源于stack exchange,提问作者Wyatt Gregory
相关产品推荐
相关产品推荐

