1. 引言在 Python 数据处理领域Excel 文件的读取是一个常见需求。xlrd 是 Python 生态中一款经典且稳定的库专门用于读取 Excel 文件.xls 和 .xlsx 格式。尽管近年来 openpyxl 等库逐渐流行但 xlrd 凭借其轻量、高效、对旧格式 .xls 的完美支持在数据迁移、报表自动化、遗留系统对接等场景中仍占据重要地位。本文将从安装、核心语法、实际案例到常见错误全面介绍 xlrd 的使用方法。2. xlrd 包概述xlrdExcel Read是一个用于读取 Excel 文件的 Python 第三方库。它支持读取 .xlsExcel 97-2003 工作簿和 .xlsxExcel 2007 工作簿格式但不支持写入 Excel 文件。xlrd 的主要功能包括打开 Excel 工作簿并获取工作表列表按行、按列或按单元格读取数据读取单元格的数据类型、格式信息支持日期、时间、布尔值等特殊数据类型的解析支持合并单元格的识别支持命名区域Named Range的读取3. 安装与版本选择3.1 基础安装使用 pip 安装 xlrdpip install xlrd3.2 版本说明xlrd 目前有两个主要版本分支xlrd 2.0支持 .xls 和 .xlsx 格式功能最全。xlrd 2.0仅支持 .xls 格式不再支持 .xlsx。如果项目需要读取 .xlsx建议使用 openpyxl 或保持 xlrd 1.2.0 版本。如需固定版本pip install xlrd1.2.04. 核心语法与参数详解4.1 打开工作簿import xlrd 打开 Excel 文件 workbook xlrd.open_workbook(example.xls) 常用参数 formatting_infoTrue — 保留格式信息仅 .xls on_demandTrue — 按需加载工作表节省内存 logfileopen(log.txt,w) — 指定日志输出文件 workbook xlrd.open_workbook(example.xls, formatting_infoTrue)4.2 获取工作表# 获取所有工作表名称 sheet_names workbook.sheet_names() 按索引获取工作表从 0 开始 sheet workbook.sheet_by_index(0) 按名称获取工作表 sheet workbook.sheet_by_name(Sheet1)4.3 读取行和列# 获取行数和列数 rows sheet.nrows cols sheet.ncols 读取整行返回列表 row_data sheet.row_values(0) # 第 1 行 读取整列 col_data sheet.col_values(0) # 第 1 列 读取指定单元格 cell_value sheet.cell_value(0, 0) # 第 1 行第 1 列 获取单元格对象包含值和类型 cell sheet.cell(0, 0) print(cell.value, cell.ctype) # ctype: 0-空,1-文本,2-数字,3-日期,4-布尔,5-错误4.4 数据类型判断from xlrd import XL_CELL_TEXT, XL_CELL_NUMBER, XL_CELL_DATE, XL_CELL_BOOLEAN, XL_CELL_EMPTY cell sheet.cell(0, 0) if cell.ctype XL_CELL_TEXT: print(文本类型:, cell.value) elif cell.ctype XL_CELL_NUMBER: print(数字类型:, cell.value) elif cell.ctype XL_CELL_DATE: # 日期需要转换为 Python 的 datetime date_tuple xlrd.xldate_as_tuple(cell.value, workbook.datemode) from datetime import datetime print(日期类型:, datetime(*date_tuple)) elif cell.ctype XL_CELL_BOOLEAN: print(布尔类型:, bool(cell.value)) elif cell.ctype XL_CELL_EMPTY: print(空单元格)4.5 日期处理# 将 Excel 日期数值转换为 Python datetime from datetime import datetime, timedelta 方法一使用 xldate_as_tuple date_tuple xlrd.xldate_as_tuple(45000, workbook.datemode) 返回 (year, month, day, hour, minute, second) dt datetime(*date_tuple) 方法二直接转换为 datetime dt xlrd.xldate_as_datetime(45000, workbook.datemode)4.6 合并单元格处理# 获取合并单元格信息仅 .xls 格式支持 merged sheet.merged_cells # 返回 [(rlo, rhi, clo, chi), ...] for rlo, rhi, clo, chi in merged: print(f合并区域: 行{rlo}-{rhi-1}, 列{clo}-{chi-1}) # 合并区域的值通常存储在左上角单元格 value sheet.cell_value(rlo, clo) print(f合并值: {value})5. 8 个实际应用案例案例 1读取 Excel 文件并打印所有数据import xlrd workbook xlrd.open_workbook(data.xls) sheet workbook.sheet_by_index(0) for row in range(sheet.nrows): row_data sheet.row_values(row) print(row_data)案例 2按列读取并计算统计值import xlrd workbook xlrd.open_workbook(sales.xls) sheet workbook.sheet_by_name(销售数据) 读取第 3 列销售额 sales sheet.col_values(2, start_rowx1) # 跳过表头 total sum(sales) average total / len(sales) print(f总销售额: {total}, 平均销售额: {average:.2f})案例 3读取日期数据并格式化输出import xlrd from datetime import datetime workbook xlrd.open_workbook(attendance.xls) sheet workbook.sheet_by_index(0) for row in range(1, sheet.nrows): date_cell sheet.cell(row, 0) if date_cell.ctype 3: # 日期类型 dt xlrd.xldate_as_datetime(date_cell.value, workbook.datemode) print(f日期: {dt.strftime(%Y-%m-%d)}) name sheet.cell_value(row, 1) print(f姓名: {name})案例 4读取多个工作表并合并数据import xlrd workbook xlrd.open_workbook(monthly_report.xls) all_data [] for sheet_name in workbook.sheet_names(): sheet workbook.sheet_by_name(sheet_name) for row in range(1, sheet.nrows): row_data sheet.row_values(row) row_data.append(sheet_name) # 添加来源工作表名 all_data.append(row_data) print(f共合并 {len(all_data)} 条记录)案例 5处理合并单元格import xlrd workbook xlrd.open_workbook(merged.xls, formatting_infoTrue) sheet workbook.sheet_by_index(0) merged sheet.merged_cells 构建合并区域映射 merge_map {} for rlo, rhi, clo, chi in merged: value sheet.cell_value(rlo, clo) for r in range(rlo, rhi): for c in range(clo, chi): merge_map[(r, c)] value for row in range(sheet.nrows): for col in range(sheet.ncols): if (row, col) in merge_map: print(merge_map[(row, col)], end\t) else: print(sheet.cell_value(row, col), end\t) print()案例 6按条件筛选数据import xlrd workbook xlrd.open_workbook(employees.xls) sheet workbook.sheet_by_index(0) 筛选部门为技术部且年龄大于 30 的员工 for row in range(1, sheet.nrows): dept sheet.cell_value(row, 2) age sheet.cell_value(row, 3) if dept 技术部 and age 30: name sheet.cell_value(row, 1) print(f{name}, 年龄: {age}, 部门: {dept})案例 7读取命名区域Named Rangeimport xlrd workbook xlrd.open_workbook(named_ranges.xls) 获取所有命名区域 for name_obj in workbook.name_map.values(): print(f名称: {name_obj.name}, 范围: {name_obj.formula_text}) 通过名称读取数据需要解析范围此处简化 实际项目中建议结合 xlutils 或直接按已知行列读取案例 8大文件按需加载on_demand 模式import xlrd 使用 on_demand 模式只加载需要的工作表 workbook xlrd.open_workbook(large_file.xls, on_demandTrue) 只读取第 2 个工作表 sheet workbook.sheet_by_index(1) for row in range(sheet.nrows): print(sheet.row_values(row)) 释放未使用的工作表 workbook.release_resources()6. 常见错误与使用注意事项6.1 常见错误错误信息原因解决方案xlrd.biffh.XLRDError: Excel xlsx file; not supportedxlrd 2.0 不支持 .xlsx降级到 xlrd1.2.0 或改用 openpyxlIndexError: list index out of range访问了不存在的行或列索引检查sheet.nrows和sheet.ncols确认范围xlrd.biffh.XLRDError: No sheet named name指定的工作表名称不存在使用sheet_names()列出所有名称后核对TypeError: must be str, not float读取数字单元格时未做类型转换使用str(cell_value)或按类型分别处理xlrd.biffh.XLRDError: Unsupported format, or corrupt file文件损坏或不是有效 Excel 文件用 Excel 打开并另存为 .xls 后再试6.2 使用注意事项版本兼容性如果项目需要同时支持 .xls 和 .xlsx建议使用 xlrd1.2.0 或搭配 openpyxl 使用。内存管理处理超大文件时使用on_demandTrue参数按需加载工作表避免内存溢出。数据类型处理Excel 中的数字可能以浮点数形式存储读取后建议根据业务需求进行类型转换如int()或str()。空单元格空单元格返回空字符串而非None判断时需注意。日期处理Excel 日期存储为浮点数必须通过xldate_as_tuple或xldate_as_datetime转换。合并单元格只有左上角单元格有值其他区域返回空需通过merged_cells属性获取合并信息。格式信息formatting_infoTrue仅对 .xls 格式有效且会增加内存消耗。编码问题处理中文 Excel 文件时确保文件编码为 UTF-8 或 GBK必要时使用encodingutf-8参数。7. 总结xlrd 是 Python 读取 Excel 文件的经典工具尤其适合处理 .xls 格式的遗留数据。本文从安装、核心语法、8 个实际案例到常见错误与注意事项全面覆盖了 xlrd 的使用场景。在实际项目中建议根据文件格式和版本需求选择合适的 xlrd 版本并注意数据类型转换、合并单元格处理等细节。对于 .xlsx 格式的写入需求可搭配 xlwt 或 openpyxl 使用形成完整的 Excel 处理方案。《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。全书共11章前6章涵盖深度学习基础包括张量运算、神经网络原理、数据预处理及卷积神经网络等后5章进阶探讨图像、文本、音频建模技术并结合Transformer架构解析大语言模型的开发实践。书中通过房价预测、图像分类等案例讲解模型构建方法每章附有动手练习题帮助读者巩固实战能力。内容兼顾数学原理与工程实现适配PyTorch框架最新技术发展趋势。