xlrd:专攻老式 .xls 文件的 Python 读取库

xlrd 在 GitHub 上拿到了 2,208 个 Star。

python-excel 组织维护的这个库,功能单一:读取 .xls 格式的 Excel 文件,把里面的数据和格式信息提取出来。不花哨,就干这一件事。

正文顶部截图

1、 它能做什么

读 .xls 文件,把工作表名称、行列数、单元格内容都拿出来。

支持的细节比较到位:读取单元格类型(空白、文本、数字、日期、布尔值),提取格式化信息(字体、颜色、对齐方式),计算合并单元格的范围。公式虽然不直接解析,但公式的计算结果能读出来。

不支持的东西也写得很清楚:图表、宏、图片、嵌入对象、VBA 模块、注释、超链接、自动筛选、高级筛选、数据透视表、条件格式、数据验证。密码保护的文件也打不开。这些都是明确不会支持的范畴,读取时会安全忽略,不会报错。

2、 为什么要用 xlrd

很多政府机构、财务部门、老旧企业系统里,.xls 格式的文件还在大量流转。这些文件用 Excel 97-2003 时代的标准生成,十几年过去,格式没变过。

处理这类文件的时候,直接用 xlrd 比用 Pandas 轻量得多。Pandas 底层调 xlrd 或 openpyxl,中间多一层,启动慢、内存占用大。如果任务只是从 .xls 里抽数据,xlrd 一行代码就够,不需要引入整个数据科学栈。

另外 xlrd 的 API 很稳。这个库从 2012 年开始维护,接口基本没变过,跑在 Python 2.7 到 3.x 上都没问题。

3、 安装和快速上手

安装:

pip install xlrd

读一个文件只需要三行:

import xlrd
book = xlrd.open_workbook("myfile.xls")
print("工作表数量: {0}".format(book.nsheets))
print("工作表名称: {0}".format(book.sheet_names()))
sh = book.sheet_by_index(0)
print("{0} 有 {1} 行 {2} 列".format(sh.name, sh.nrows, sh.ncols))
print("D30 单元格的值: {0}".format(sh.cell_value(rowx=29, colx=3)))
for rx in range(sh.nrows):
    print(sh.row(rx))

命令行也能用,快速预览每个工作表的前几行:

python PYDIR/scripts/runxlrd.py 3rows *.xls

README区域截图

4、 一个重要的限制

xlrd 从 2.0 版本开始,只读 .xls 文件。

如果手头是 .xlsx、.xlsm 这类新格式,xlrd 会直接报错。这是作者有意为之的,把 .xls 解析这件事做透,不去碰新格式。需要处理 .xlsx 的话,可以用同组织的 openpyxl 库,或者直接用 Pandas。

这个决策争议不小,但反过来想,也意味着 xlrd 不会因为兼容新格式而引入 bug,稳定性反而更高。

5、 适合哪些人用

  • 需要从遗留系统的 .xls 文件中批量提取数据的开发者
  • 做数据迁移项目、需要解析大量旧格式 Excel 的场景
  • 不想引入 Pandas 这种重量级依赖、只需要读一个老格式文件的轻量需求

做数据迁移项目、需要解析大量旧格式 Excel 的场景

  • 不想引入 Pandas 这种重量级依赖、只需要读一个老格式文件的轻量需求

更多推荐