当前位置: 代码网 > it编程>前端脚本>Python > Python xlrd实现从读取Excel到高效数据提取的全面指南

Python xlrd实现从读取Excel到高效数据提取的全面指南

2025年10月10日 Python 我要评论
一、前言:excel 与 python 的不解之缘在数据处理与办公自动化领域,excel 文件(.xls / .xlsx) 一直是最常见的数据载体。而在 python 世界中,围绕 excel 操作的

一、前言:excel 与 python 的不解之缘

在数据处理与办公自动化领域,excel 文件(.xls / .xlsx) 一直是最常见的数据载体。

而在 python 世界中,围绕 excel 操作的生态非常庞大,其中最经典、最轻量级的读文件库之一便是 —— xlrd

xlrd 是一个专门用于读取 excel 文件内容的 python 库,它支持从 excel 工作簿中提取工作表(sheet)、单元格内容、数据类型等信息。

虽然在新版本中它仅支持旧格式 .xls 文件,但凭借其简洁、高效和稳定的特点,xlrd 依然在许多老系统与数据迁移任务中被广泛使用。

二、库的起源与演变:从万能到专一

在早期的 python excel 生态中,xlrdxlwt(写入)是一对黄金搭档,配合使用可以轻松实现 excel 的读写操作。

  • xlrd(read):读取 excel 文件内容。
  • xlwt(write):写入 .xls 文件。
  • xlutils:基于二者实现的高级操作库(复制、修改工作表等)。

然而,自 xlrd 2.0.0 起,官方宣布:

不再支持 .xlsx 文件读取,仅支持 excel 97-2003 格式 .xls

主要原因包括:

  • excel 2007 之后的 .xlsx 文件是基于 xml + zip 的复杂结构,解析成本高;
  • 已有更现代的库如 openpyxlpandas 提供更好的支持;
  • 维护者希望 xlrd 聚焦旧格式的稳定读取。

这也导致了后期许多项目迁移至 openpyxlpandas.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 的内部设计采用了典型的分层数据结构,理解这点有助于掌握其灵活性:

层级对象名称描述
1bookexcel 文件对象(工作簿)
2sheet每个工作表
3cell单元格对象(包含值与类型)
4xfrecord样式记录对象(字体、边框、格式等)

这种结构类似于文档树(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 类型:

类型编号类型名含义
0xl_cell_empty空单元格
1xl_cell_text字符串
2xl_cell_number数值
3xl_cell_date日期
4xl_cell_boolean布尔值
5xl_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-01a类产品12030上海
2024-01-02b类产品8025北京

目标

  • 计算各产品的总销售额
  • 输出每个地区的总销售额分布

步骤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)

八、与其他库的比较

功能点xlrdopenpyxlpandas
支持文件格式.xls.xlsx.xls + .xlsx
读取速度快(小文件)稍慢中等
内存占用较低较高中等
写入能力
api 难度简单中等简单
适合场景老系统兼容、轻量提取现代 excel 操作分析任务

总结:

  • 如果你只需读取 .xls 文件:选 xlrd。
  • 如果需要写入或支持 .xlsx:用 openpyxl。
  • 如果需要快速分析:用 pandas.read_excel()。

九、深入源码:xlrd的解析机制

xlrd 的核心逻辑位于 book.pysheet.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. 推荐替代方案

  • 读取 .xlsxlrd
  • 写入 .xlsxlwt
  • 读取/写入 .xlsxopenpyxl
  • 分析型任务: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 rangesheet 索引错误确认工作表存在
unicodedecodeerror编码问题指定 encoding_override="gbk"

十三、与 pandas 的结合:批量数据分析

pandasread_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的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com