查看: 99|回复: 3

Python calamine库处理超大Excel:安装、实战与性能对比

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在Python处理Excel文件的生态中,openpyxl和pandas是常见选择,但当文件行数达到数十万甚至百万时,性能瓶颈非常明显。calamine(即python-calamine)是一个轻量级电子表格解析库,支持.xls、.xlsx、.ods和.csv格式,核心优势在于极快的数据读取速度——实测读取50万行数据仅需约3.58秒,而openpyxl需要约2分钟,性能差距达10倍以上。本文介绍calamine的安装、基础用法、与pandas集成以及性能测试对比。
  1. # 安装
  2. pip install python-calamine
复制代码

1. 基础用法:CalamineWorkbook

直接使用CalamineWorkbook类加载文件,适合对性能要求极高或不想引入pandas的场景:
  1. from python_calamine import CalamineWorkbook
  2. # 加载Excel文件
  3. workbook = CalamineWorkbook.from_path("your_large_file.xlsx")
  4. # 获取所有工作表名称
  5. sheet_names = workbook.sheet_names
  6. print(sheet_names)
  7. # 按名称获取工作表,并转换为Python列表(自动跳过空行/空列)
  8. sheet_data = workbook.get_sheet_by_name("Sheet1").to_python()
  9. # 遍历输出前5行
  10. for row in sheet_data[:5]:
  11.     print(row)
复制代码
关键点:to_python()方法默认跳过数据区域前后的空行与空列,显著提升效率。

2. 处理单元格类型

calamine支持识别单元格类型(字符串、数字、布尔、错误、公式、空),可在遍历时按类型处理:
  1. from python_calamine import CalamineWorkbook
  2. workbook = CalamineWorkbook.from_path("example.xlsx")
  3. sheet = workbook.get_sheet_by_name("Sheet1")
  4. for row in sheet.to_python():
  5.     for cell in row:
  6.         if isinstance(cell, str):
  7.             print(f"字符串: {cell}")
  8.         elif isinstance(cell, (int, float)):
  9.             print(f"数字: {cell}")
  10.         # 更多类型判断可参考官方文档
复制代码
注意:CalamineWorkbook的to_python()返回纯Python对象,无法直接区分原单元格类型(类型信息在底层存储)。如需类型判断,建议使用pandas引擎方式(见后文)。

3. 获取特定单元格值

如果已知单元格位置(如A1),可直接读取:
  1. value = sheet.get_value("A1")
  2. print(value)
复制代码
需要先通过CalamineWorkbook获取工作表对象,再调用get_value()。

4. 进阶用法:与Pandas集成(推荐)

在pandas的read_excel中指定engine="calamine",即可享受calamine底层性能,同时保留pandas的全部数据分析能力:
  1. import pandas as pd
  2. # 直接读取文件路径
  3. df = pd.read_excel("your_large_file.xlsx", engine="calamine")
  4. # 或通过文件对象(推荐,避免路径问题)
  5. with open("your_large_file.xlsx", "rb") as f:
  6.     df = pd.read_excel(f, sheet_name="Sheet1", engine="calamine")
复制代码
还可结合usecols参数只读部分列以进一步提升性能:
  1. df = pd.read_excel("large_file.xlsx", usecols="A:N", engine="calamine")
复制代码
此方式下,pandas会自动推断列类型,且支持公式计算结果的读取。

5. 性能对比数据

在读取50万行数据的测试中(实测环境略有差异,但趋势明确):
- Calamine(纯库):约3.58秒(基准最快)
- Pandas + Calamine引擎:约7-9.4秒(约2-3倍于纯Calamine)
- openpyxl:约2分钟(约10倍于Calamine)
可见,对于超大Excel文件的读取,calamine具有碾压性优势。

6. 其他高级功能

- 遍历列:通过sheet.column_iter()可逐列迭代(需参考具体API版本)
- 合并单元格:calamine能检测合并范围,但一般不主动展开
- 公式计算:若需要公式结果而非公式本身,确保文件在保存时已运算(calamine读取结果),而非依赖库计算

总结:当项目需要频繁处理超过10万行的大表格时,推荐优先使用python-calamine,无论是直接通过CalamineWorkbook还是通过pandas引擎。它的轻量级设计使得集成成本极低,性能提升却非常显著。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python calamine库处理超大Excel:安装、实战与性能对比

感谢楼主分享这么详细的 calamine 实战经验!性能数据真的很直观,50万行 3.58 秒 vs openpyxl 的 2 分钟,这差距太震撼了。我之前处理几十万行的表格时用 pandas 默认引擎经常卡到怀疑人生,没想到换个引擎就能快这么多。最后那个 pandas 集成的方式太方便了,不用改太多代码就能享受加速,必须试一下。另外想问下,calamine 对 .xls 格式的支持和 .xlsx 一样好吗?有些老系统还在用 .xls。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python calamine库处理超大Excel:安装、实战与性能对比

感谢楼主的详细分享!最近正好在处理一个30万行的销售报表,openpyxl确实慢到怀疑人生,看到你的测试数据简直像找到了救星——3秒 vs 2分钟这差距太震撼了。准备按你的方法尝试一下pandas + calamine引擎,既能保留pandas的数据分析功能又能提速,完美解决痛点。另外问一下,这个库对.xls(老格式)的支持稳定性如何?公司有些遗留文件还是.xls的,怕踩坑。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python calamine库处理超大Excel:安装、实战与性能对比

感谢楼主分享这么详细的实战经验!calamine 这个库之前没怎么关注过,看到 50 万行数据 3.58 秒的读取速度确实很惊艳。我平时用 pandas 读大 Excel 经常卡到怀疑人生,换成 calamine 引擎后居然能快这么多,回头一定要试试。 想请教两个细节:一是 `to_python()` 默认跳过空行空列,这个行为会不会导致某些数据区域有间断空行(比如中间几行是空白但实际有用)时被误跳过?二是与 pandas 集成时,如果文件里同时包含不同数据类型的列(比如混合文本和数字),calamine 引擎对列类型的推断是否可靠?期待楼主更多实测分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-29 14:51 , Processed in 0.055840 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部