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

 更新时间:2025年10月10日 08:41:42   作者:萧鼎  
xlrd 是一个专门用于读取 Excel 文件内容的 Python 库,它支持从 Excel 工作簿中提取工作表(Sheet),单元格内容,数据类型等信息,下面小编就为大家详细介绍一下它的具体使用吧

一、前言: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的资料请关注脚本之家其它相关文章!

相关文章

  • python 中不同包 类 方法 之间的调用详解

    python 中不同包 类 方法 之间的调用详解

    这篇文章主要介绍了python 中不同包 类 方法 之间的调用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python之京东商品秒杀的实现示例

    Python之京东商品秒杀的实现示例

    这篇文章主要介绍了Python之京东商品秒杀的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python实现字典依据value排序

    Python实现字典依据value排序

    新华字典大家都使用过吧,那么使用python语言是如何实现字典排序的呢?下面跟着本教程一起学习Python实现字典依据value排序,需要的朋友参考下吧
    2016-02-02
  • 利用python实现简单的循环购物车功能示例代码

    利用python实现简单的循环购物车功能示例代码

    购物车对我们每位开发者来说应该都不陌生,下面这篇文章主要给大家介绍了利用python实现简单的循环购物车功能的相关资料,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面来一起看看吧。
    2017-07-07
  • Python气泡提示与标签的实现

    Python气泡提示与标签的实现

    这篇文章主要介绍了Python气泡提示与标签的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • python从网络读取图片并直接进行处理的方法

    python从网络读取图片并直接进行处理的方法

    这篇文章主要介绍了python从网络读取图片并直接进行处理的方法,涉及cStringIO模块模拟本地文件的使用技巧,需要的朋友可以参考下
    2015-05-05
  • 教你用Python写安卓游戏外挂

    教你用Python写安卓游戏外挂

    本篇文章主要给教给大家如何用python这个语言写出安卓游戏的辅助外挂以及思路讲解,有兴趣的朋友跟着学习下吧。
    2018-01-01
  • 分享十个Python超级好用提高工作效率的自动化脚本

    分享十个Python超级好用提高工作效率的自动化脚本

    在这个自动化时代,我们有很多重复无聊的工作要做。 想想这些你不再需要一次又一次地做的无聊的事情,让它自动化,让你的生活更轻松。本文分享了10个Python自动化脚本,希望对大家有所帮助
    2022-11-11
  • 使用python爬虫实现子域名探测问题

    使用python爬虫实现子域名探测问题

    子域名枚举是为一个或多个域查找子域的过程,它是信息收集阶段的重要组成部分,这篇文章主要介绍了使用python实现子域名探测,需要的朋友可以参考下
    2022-07-07
  • Python实现.gif图片拆分为.png图片的简单示例

    Python实现.gif图片拆分为.png图片的简单示例

    有时候需要把GIF图片分解成一张一张的静态图,jpg或者png格式,下面这篇文章主要给大家介绍了关于Python实现.gif图片拆分为.png图片的相关资料,需要的朋友可以参考下
    2023-01-01

最新评论