一、前言: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:基于二者实现的高级操作库(复制、修改工作表等)。
然而,自 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 | 样式记录对象(字体、边框、格式等) |
这种结构类似于文档树(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]
region = 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. 启用按需加载
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 的核心逻辑位于 book.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的资料请关注代码网其它相关文章!
发表评论