Python xlrd实现从读取Excel到高效数据提取的全面指南
目录
- 一、前言:Excel 与 python 的不解之缘
- 二、库的起源与演变:从万能到专一
- 三、安装与环境要求
- 1. 安装方式
- 2. 版本建议
- 3. 基本依赖
- 四、核心对象结构分析
- 五、主要API与使用方法详解
- 1. 打开 Excel 文件
- 2. 获取工作表
- 3. 获取单元格内容与属性
- 4. 遍历所有数据
- 5. 日期类型的处理
- 六、实战案例:Excel 数据提取与分析
- 案例背景
- 目标
- 七、性能优化与大文件读取
- 1. 启用按需加载
- 2. 避免重复读取单元格对象
- 3. 文件格式转换
- 八、与其他库的比较
- 九、深入源码:xlrd的解析机制
- 十、版本兼容与迁移策略
- 1. xlrd >= 2.0 不支持 .xlsx
- 2. 向下兼容旧系统
- 3. 推荐替代方案
- 十一、实际应用案例:自动报表系统
- 十二、常见错误与排查
- 十三、与 Pandas 的结合:批量数据分析
- 十四、总结与展望
一、前言:Excel 与 Python 的不解之缘
在数据处理与办公自动化领域,Excel 文件(.xls / .xlsx) 一直是最常见的数据载体。
而在 Python 世界中,围绕 Excel 操作的生态非常庞大,其中最经典、最轻量级的读文件库之一便是 —— xlrd
。
xlrd
是一个专门用于读取 Excel 文件内容的 Python 库,它支持从 Excel 工作簿中提取工作表(Sheet)、单元格内容、数据类型等信息。
虽然在新版本中它仅支持旧格式 .xls
文件,但凭借其简洁、高效和稳定的特点,xlrd
依然在许多老系统与数据迁移任务中被广泛使用。
二、库的起源与演变:从万能到专一
在早期的 Python Excel 生态中,xlrd
和 xlwt
(写入)是一对黄金搭档,配合使用可以轻松实现 Excel 的读写操作。
- xlrd(read):读取 Excel 文件内容。
- xlwt(write):写入
.xls
文件。 - xlutils:基于二者实现的高级操作库(复制、修改工作表等)。
然而,自www.devze.com xlrd 2.0.0
起,官方宣布:
不再支持 .xlsx
文件读取,仅支持 Excel 97-2003 格式 .xls
。
主要原因包括:
- Excel 2007 之后的
.xlsx
文件是基于 XML + ZIP 的复杂结构,解析成本高; - 已有更现代的库如
openpyxl
和pandas
提供更好的支持; - 维护者希望
xlrd
聚焦旧格式的稳定读取。
这也导致了后期许多项目迁移至 openpyxl
或 pandas.read_excel()
。不过,如果你面对的是历史系统、银行报表、政府旧数据,xlrd
仍然是最轻量可靠的解决方案。
三、安装与环境要求
1. 安装方式
pip install xlrd
2. 版本建议
如果你的 Excel 文件是 .xlsx
格式,请务必使用旧版本(≤1.2.0):
pip install xlrd==1.2.0
否则会遇到如下错误:
XLRDError: Excel xlsx file; not supported
3. 基本依赖
xlrd
只依赖标准库和 zipfile
模块,因此即使在嵌入式系统(如树莓派、Jetson Nano)上也能轻松运行。
四、核心对象结构分析
xlrd
的内部设计采用了典型的分层数据结构,理解这点有助于掌握其灵活性:
层级 | 对象名称 | 描述 |
---|---|---|
1 | Book | Excel 文件对象(工作簿) |
2 | Sheet | 每个工作表 |
3 | Cell | 单元格对象(包含值与类型) |
4 | XFRecord | 样式记录对象(字体、边框、格式等) |
这种python结构类似于文档树(Document Object Model),读取 Excel 时,xlrd
会逐级解析:
import xlrd workbook = xlrd.open_workbook("data.xls") sheet = workbook.sheet_by_index(0) value = sheet.cell_value(0, 0) print(value)
执行结果:
员工编号
五、主要API与使用方法详解
1. 打开 Excel 文件
import xlrd book = xlrd.open_workbook("report.xls")
支持参数:
filename
: 文件路径file_contents
: 二进制字节流encoding_override
: 指定编码(如 GBK)on_demand
: 是否懒加载(节省内存)ragged_rows
: 是否允许行列不对齐
2. 获取工作表
# 通过索引 sheet = book.sheet_by_index(0) # 通过名称 sheet = book.sheet_by_name('销售数据') # 获取所有表名 print(book.sheet_names())
3. 获取单元格内容与属性
value = sheet.cell_value(1, 2) # 第二行第三列 ctype = sheet.cell_type(1, 2) # 数据类型
常见的 ctype
类型:
类型编号 | 类型名 | 含义 |
---|---|---|
0 | XL_CELL_EMPTY | 空单元格 |
1 | XL_CELL_TEXT | 字符串 |
2 | XL_CELL_NUMBER | 数值 |
3 | XL_CELL_DATE | 日期 |
4 | XL_CELL_BOOLEAN | 布尔值 |
5 | XL_CELL_ERROR | 错误 |
4. 遍历所有数据
for row_idx in range(sheet.nrows): row = sheet.row_values(row_idx) print(row)
或者使用 get_rows()
:
for row in sheet.get_rows(): print([cell.value for cell in row])
5. 日期类型的处理
Excel 内部使用浮点数存储日期,需要借助 xlrd.xldate_as_datetime()
进行转换:
from datetime import datetime date_value = sheet.cell_value(2, 3) date_obj = xlrd.xldate_as_datetime(date_value, book.datemode) print(date_obj.strftime("%Y-%m-%d"))
六、实战案例:Excel 数据提取与分析
下面通过一个实际案例展示如何利用 xlrd
实现报表数据分析。
案例背景
某公司每月导出一份 sales_2024.xls
销售报表,包含以下字段:
日期 | 产品 | 销量 | 单价 | 地区 |
---|---|---|---|---|
2024-01-01 | A类产品 | 120 | 30 | 上海 |
2024-01-02 | B类产品 | 80 | 25 | 北京 |
目标
- 计算各产品的总销售额
- 输出每个地区的总销售额分布
步骤1:读取数据
import xlrd book = xlrd.open_workbook('sales_2024.xls') sheet = book.sheet_by_index(0) data = [] for row_idx in range(1, sheet.nrows): row = sheet.row_values(row_idx) data.append(row)
步骤2:计算汇总
from collections import defaultdict product_sales = defaultdict(float) region_sales = defaultdict(float) for row in data: product = row[1] sales = row[2] * row[3] regiandroidon = row[4] product_sales[product] += sales region_sales[region] += sales print("按产品统计:", dict(product_sales)) print("按地区统计:", dict(region_sales))
输出结果:
按产品统计: {'A类产品': 3600.0, 'B类产品': 2000.0}
按地区统计: {'上海': 3600.0, '北京': 2000.0}
步骤3:可视化展示(与 Matplotlib 结合)
import matplotlib.pyplot as plt plt.bar(product_sales.keys(), product_sales.values()) plt.title("产品销售额对比") plt.xlabel("产品") plt.ylabel("销售额(元)") plt.show()
这展示了 xlrd
在数据提取阶段的强大能力,与现代可视化库完美兼容。
七、性能优化与大文件读取
当 Excel 文件行数超过 10 万行时,内存开销会显著上升。
以下技巧可帮助提升性能:
1. 启用按需加载javascript
book = xlrd.open_workbook('large.xls', on_demand=True)
仅在访问某个 Sheet 时加载数据,可显著节省内存。
2. 避免重复读取单元格对象
使用 row_values()
一次性获取整行数据,而非多次调用 cell_value()
。
3. 文件格式转换
若文件超过几百 MB,建议先用命令行或 pandas
转为 CSV 再分析:
import pandas as pd df = pd.read_excel('large.xls', engine='xlrd') df.to_csv('large.csv', index=False)
八、与其他库的比较
功能点 | xlrd | openpyxl | pandas |
---|---|---|---|
支持文件格式 | .xls | .xlsx | .xls + .xlsx |
读取速度 | 快(小文件) | 稍慢 | 中等 |
内存占用 | 较低 | 较高 | 中等 |
写入能力 | 无 | 有 | 有 |
API 难度 | 简单 | 中等 | 简单 |
适合场景 | 老系统兼容、轻量提取 | 现代 Excel 操作 | 分析任务 |
总结:
- 如果你只需读取 .xls 文件:选 xlrd。
- 如果需要写入或支持 .xlsx:用 openpyxl。
- 如果需要快速分析:用 pandas.read_excel()。
九、深入源码:xlrd的解析机制
xlrd
的核心逻辑位于 booklbqipTi.py
与 sheet.py
模块。其工作流程大致为:
- 打开文件 → 识别格式(OLE2 vs XML)
- 解析 Workbook → Sheet → Cell
- 建立数据缓存与索引表
- 提供 Pythonic API 封装访问
核心函数结构如下:
def open_workbook(filename=None, file_contents=None, encoding_override=None, ...): bk = Book() bk.load(filename) return bk
Book
类中维护 sheets
列表,每个 Sheet 又包含 _cell_values
数组和 _cell_types
数组,用于快速索引。这种结构虽然不如 pandas
灵活,但胜在内存可控和结构清晰。
十、版本兼容与迁移策略
1. xlrd >= 2.0 不支持 .xlsx
对于 .xlsx
文件,请使用:
import pandas as pd df = pd.read_excel('file.xlsx', engine='openpyxl')
2. 向下兼容旧系统
若必须兼容 .xls
与 .xlsx
:
try: book = xlrd.open_workbook('data.xlsx') except Exception: import openpyxl wb = openpyxl.load_workbook('data.xlsx')
3. 推荐替代方案
- 读取
.xls
:xlrd
- 写入
.xls
:xlwt
- 读取/写入
.xlsx
:openpyxl
- 分析型任务:
pandas
十一、实际应用案例:自动报表系统
在许多中小企业中,日报/周报 Excel 报表往往手动汇总。使用 xlrd
可实现自动提取并生成汇总结果。
示例流程:
- 扫描
./reports
文件夹下所有.xls
文件 - 读取每个文件中的“销售额”数据
- 汇总后生成一份统计表(通过
xlwt
写出)
import os, xlrd, xlwt summary = xlwt.Workbook() sheet_sum = summary.add_sheet('汇总') row_index = 0 for file in os.listdir('./reports'): if file.endswith('.xls'): wb = xlrd.open_workbook(os.path.join('./reports', file)) sh = wb.sheet_by_index(0) total = sum(sh.col_values(2)[1:]) # 第三列为销售额 sheet_sum.write(row_index, 0, file) sheet_sum.write(row_index, 1, total) row_index += 1 summary.save('汇总结果.xls')
这就是最典型的办公自动化应用之一。
十二、常见错误与排查
错误类型 | 说明 | 解决方法 |
---|---|---|
XLRDError: Excel xlsx file; not supported | 新版本不支持 .xlsx | 降级至 xlrd==1.2.0 |
FileNotFoundError | 文件路径错误 | 检查路径、使用绝对路径 |
IndexError: list index out of range | Sheet 索引错误 | 确认工作表存在 |
UnicodeDecodeError | 编码问题 | 指定 encoding_override="gbk" |
十三、与 Pandas 的结合:批量数据分析
pandas
的 read_excel()
默认会使用 xlrd
(旧版本),因此你可以结合两者快速分析数据:
import pandas as pd df = pd.read_excel('report.xls', engine='xlrd') print(df.describe())
对于 .xlsx
文件:
df = pd.read_excel('report.xlsx', engine='openpyxl')
十四、总结与展望
xlrd
虽然是一个“老派”库,但它依然具备以下优势:
- 轻量级、稳定性高
- 适合服务器端、嵌入式环境
- 兼容老式 Excel 格式
- 代码简单易嵌入脚本
在现代 Python 数据分析生态中,xlrd
更多地扮演**“稳定读取引擎”**的角色,而非“通用 Excel 工具”。
对于大多数历史数据处理、Excel 自动化迁移任务而言,它仍然是一款值得信赖的老朋友。
以上就是Python xlrd实现从读取Excel到高效数据提取的全面指南的详细内容,更多关于Python xlrd读取Excel的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论