Python读取Excel选哪个库?pandas、openpyxl与xlrd对比

Dylan
Dylan
发布时间:2026-11-09| 8人浏览过
原创

全面对比Python读取Excel的三大主流库pandas、openpyxl与xlrd:格式支持差异、代码示例、性能与内存表现,以及清晰的选型决策树和避坑指南。

核心结论:在 Python 中读取 Excel 文件时,工具选型主要取决于数据目标与文件格式。如果是为了进行数据清洗、多表合并或统计分析,首选 pandas;如果需要精细控制或保留单元格样式、公式元数据或流式读取超大 .xlsx 文件,首选 openpyxl;如果需要读取历史遗留的 .xls(Excel 97-2003 二进制格式)文件,则使用 xlrd(需注意 xlrd 2.0+ 已彻底移除对 .xlsx 的支持)。
Python读取Excel选哪个库?pandas、openpyxl与xlrd对比
图 0:Python 处理 Excel 三大核心库定位与应用场景总览

一、底层定位与格式支持差异

在探讨如何选择之前,必须先理清 Excel 常见文件格式的物理本质。平时接触的 Excel 文件主要有两类:一种是拓展名为 .xlsx 的现代工作簿,另一种是老旧的 .xls 格式。这两者在底层存储架构上存在根本差异:

  • .xlsx 格式(Excel 2007 至今):本质是一个基于 OpenXML 标准的 ZIP 压缩包,内部包含多个记录工作表、单元格、样式和关系的 XML 文本文件。
  • .xls 格式(Excel 97-2003):是微软早期的专有二进制文件格式,遵循 BIFF8(Binary Interchange File Format)规范。

正因为物理结构的根本不同,Python 社区针对不同格式和需求分化出了不同的库:

Python读取Excel选哪个库?pandas、openpyxl与xlrd对比
图 1:Excel 物理文件格式、底层解析引擎与上层数据框架的架构映射

1. xlrd:专注于旧版 .xls 的轻量读取器

xlrd 是 Python 早期处理 Excel 最成熟的工具之一。它的优势在于解析底层 BIFF 二进制字节流非常迅速,且内存开销极小。但需要特别注意的是它的版本分水岭:

重大避坑提醒:从 2020 年底发布的 xlrd 2.0.0 开始,由于潜在的 XML 外部实体(XXE)安全隐患及维护成本,官方主动移除了对 .xlsx 格式的支持。如果在现代 Python 环境中使用最新版 xlrd 打开 .xlsx 文件,会直接抛出 xlrd.biffh.XLRDError: Excel xlsx file; not supported 错误。因此,xlrd 目前仅且专门用于读取 .xls 格式。

2. openpyxl:现代 .xlsx 格式的事实标准

openpyxl 是目前 Python 生态中处理 .xlsx 和 .xlsm 最主流的纯 Python 库。它完整实现了 OpenXML 规范,不仅能读取表格里的纯文本和数值,还能完整读取单元格背景色、字体边框、数字格式(例如货币或日期)、公式原文以及图表元数据。同时,openpyxl 具备完整的读写能力,既可以读取也能在原表基础上修改并回存。

3. pandas:面向数据分析与处理的高级抽象

pandas 并不是一个底层的 Excel 解析器。当调用 pandas.read_excel() 时,pandas 实际上是在上层充当“指挥调度”的角色:它会根据文件后缀或显式指定的 engine 参数,去调用底层的解析引擎(默认对 .xlsx 调用 openpyxl,对 .xls 调用 xlrd)。读取完成后,pandas 将离散的单元格组织成高度结构化的 DataFrame,便于后续执行求和、筛选、透视和关联等操作。

二、读取代码示例与执行流程对比

为了直观感受三个库在实际代码中的交互习惯与结果形态,下面分别演示读取同一个示例文件的具体实现。

Python读取Excel选哪个库?pandas、openpyxl与xlrd对比
图 2:三大库从文件加载到内存数据结构生成的具体步骤对比

1. 使用 openpyxl 读取 .xlsx 文件

openpyxl 面向的是工作簿(Workbook)、工作表(Worksheet)和单元格(Cell)的树状对象模型。如果需要遍历读取数据,通常使用 iter_rows() 方法:

from openpyxl import load_workbook

# 加载工作簿
wb = load_workbook(filename="sales_data.xlsx", data_only=True)
ws = wb.active  # 获取当前活跃的工作表

# 逐行读取单元格纯值 (values_only=True 直接返回数值而非 Cell 对象)
data_rows = []
for row in ws.iter_rows(values_only=True):
    data_rows.append(row)

print(f"读取到的表头: {data_rows[0]}")
print(f"数据总行数: {len(data_rows) - 1}")
示例运行输出
读取到的表头: ('订单号', '产品名称', '单价', '数量', '成交日期')
数据总行数: 120

参数说明: data_only=True 表示遇到公式单元格时读取公式计算后的缓存值,若为 False 则读取公式字符串(如 =SUM(C2:C10))。

2. 使用 pandas 读取表格为 DataFrame

如果不需要单元格颜色和边框,只希望快速把表格转为数据分析格式,pandas 只需一行代码:

import pandas as pd

# 一键将 Excel 表格读入 DataFrame
df = pd.read_excel(
    io="sales_data.xlsx",
    sheet_name="Sheet1",
    engine="openpyxl"  # 明确指定底层解析引擎
)

# 直接查看数据前3行与基本统计
print(df.head(3))
print(f"平均单价: {df['单价'].mean():.2f}")
示例运行输出
      订单号   产品名称    单价  数量    成交日期
0  ORD1001  机械键盘  299.0    2  2026-03-01
1  ORD1002  无线鼠标   89.0    5  2026-03-01
2  ORD1003  显示器支架 159.0    1  2026-03-02
平均单价: 182.33

3. 使用 xlrd 读取历史 .xls 文件

对于老旧系统导出的 .xls 文件,xlrd 是最稳定高效的工具:

import xlrd

# 打开旧版二进制文件
book = xlrd.open_workbook("legacy_report.xls")
sheet = book.sheet_by_index(0)  # 按索引选取工作表

print(f"表格总行数: {sheet.nrows}, 总列数: {sheet.ncols}")
# 获取第0行(表头)
headers = [sheet.cell_value(0, col) for col in range(sheet.ncols)]
print(f"表头列名: {headers}")
示例运行输出
表格总行数: 450, 总列数: 6
表头列名: ['部门编号', '员工姓名', '入职日期', '基本薪资', '绩效评分', '所属城市']

三、核心特性与性能深度对比

面对具体业务时,往往还要综合衡量内存开销、数据处理能力以及格式保留能力。下表和图表总结了关键维度的横向评测结果:

Python读取Excel选哪个库?pandas、openpyxl与xlrd对比
图 3:三大库在格式支持、资源控制、计算及样式保留维度的综合能力矩阵
对比维度 pandas openpyxl xlrd (>=2.0)
支持的文件格式 .xlsx, .xls 等(视底层引擎而定) .xlsx, .xlsm, .xltx 仅限 .xls (Excel 97-2003)
内存占用机制 取决于 DataFrame 尺寸,支持分块读入 默认 DOM 模式内存较高;提供流式 read_only 极低,直接流式解析 BIFF8 结构
单元格样式保留 完全丢弃样式,仅提取纯数值 完整读取/写入字体、填充色、边框等 仅支持提取旧版简单字体/格式代码
公式处理能力 仅读取公式计算后的缓存值 既可读取公式原文本,也可读缓存值 仅读取计算值或公式标识符
数据清洗与统计 极强(内置数百种分组、透视与矩阵算法) 无内置计算功能,需自行组织循环 无内置计算功能,需自行组织循环
写回与修改支持 全量覆盖写入 (to_excel) 支持局部修改单元格并精确回存 不支持写入(纯只读工具)

关于内存开销的关键细节

很多人在读取数十兆甚至上百兆的 .xlsx 文件时会遭遇内存飙升。这是因为 .xlsx 本身经过了 ZIP 高度压缩,解压后其内部的 XML 体积通常会膨胀 5 至 10 倍。如果使用 openpyxl 的普通模式(load_workbook()),库会为每个单元格在内存中实例化一个包含样式、位置、属性的完整 Python 对象,导致内存暴涨数百兆甚至数吉字节。

优化策略:如果必须使用 openpyxl 读取上百兆的大文件,务必开启流式模式:load_workbook(filename, read_only=True)。该模式基于迭代生成器逐步解析 XML,只在遍历当前行时载入单元格,能将内存占用压缩至几兆以内。

四、选型决策指南与避坑排查

在了解了三者的特性后,可以通过以下决策路径快速确定最适合当前项目的库:

Python读取Excel选哪个库?pandas、openpyxl与xlrd对比
图 4:Python 读取 Excel 选型决策树与判断流程

常见典型应用场景对照

  • 场景 1:运营报表批量合并与指标计算。

    手头有数十个分支机构上报的销售表格,需要提取其中的数值列并按地区汇总。明确选 pandas。借助 pd.concat 和 groupby 可以在几行代码内搞定,无需繁琐的双层循环。

  • 场景 2:模板化报表处理与样式生成。

    需要在现有的 Excel 模板中填充指定数据,并为异常值标注红色背景,同时保留其他表格中的柱状图。明确选 openpyxl。pandas 会重写整个工作簿并洗掉所有格式,而 openpyxl 能够精准修改目标坐标的单元格。

  • 场景 3:维护十年前遗留系统的备份数据。

    从老旧 ERP 或银行接口下载的历史文件均为 .xls 格式。明确选 xlrd,或者使用 pandas.read_excel('file.xls', engine='xlrd')。

开发中常见的报错排查

在实际开发过程中,以下两类报错出现频率最高:

  1. 报错信息:ImportError: Missing optional dependency 'openpyxl'. Use pip or conda to install openpyxl.
    发生原因:在调用 pd.read_excel('data.xlsx') 时,虽然安装了 pandas,但当前虚拟环境中缺少默认的底层解析引擎。
    解决方法:执行 pip install openpyxl 补齐依赖即可。
  2. 报错信息:xlrd.biffh.XLRDError: Excel xlsx file; not supported
    发生原因:代码中试图用 xlrd 打开 .xlsx 文件,或者在使用 pandas 读取 .xlsx 时误写了 engine='xlrd'。
    解决方法:对于 .xlsx 文件,将 engine 参数替换为 engine='openpyxl'。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。