开发者

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 生态中,xlrdxlwt(写入)是一对黄金搭档,配合使用可以轻松实现 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 的复杂结构,解析成本高;
                • 已有更现代的库如 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样式记录对象(字体、边框、格式等)

                这种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 类型:

                类型编号类型名含义
                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]
                    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)
                

                八、与其他库的比较

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

                总结:

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

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

                xlrd 的核心逻辑位于 booklbqipTi.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的资料请关注编程客栈(www.devze.com)其它相关文章!

                0

                上一篇:

                下一篇:

                精彩评论

                暂无评论...
                验证码 换一张
                取 消

                最新开发

                开发排行榜