在Python处理Excel文件的生态中,openpyxl和pandas是常见选择,但当文件行数达到数十万甚至百万时,性能瓶颈非常明显。calamine(即python-calamine)是一个轻量级电子表格解析库,支持.xls、.xlsx、.ods和.csv格式,核心优势在于极快的数据读取速度——实测读取50万行数据仅需约3.58秒,而openpyxl需要约2分钟,性能差距达10倍以上。本文介绍calamine的安装、基础用法、与pandas集成以及性能测试对比。
- # 安装
- pip install python-calamine
复制代码
1. 基础用法:CalamineWorkbook
直接使用CalamineWorkbook类加载文件,适合对性能要求极高或不想引入pandas的场景:- from python_calamine import CalamineWorkbook
- # 加载Excel文件
- workbook = CalamineWorkbook.from_path("your_large_file.xlsx")
- # 获取所有工作表名称
- sheet_names = workbook.sheet_names
- print(sheet_names)
- # 按名称获取工作表,并转换为Python列表(自动跳过空行/空列)
- sheet_data = workbook.get_sheet_by_name("Sheet1").to_python()
- # 遍历输出前5行
- for row in sheet_data[:5]:
- print(row)
复制代码 关键点:to_python()方法默认跳过数据区域前后的空行与空列,显著提升效率。
2. 处理单元格类型
calamine支持识别单元格类型(字符串、数字、布尔、错误、公式、空),可在遍历时按类型处理:- from python_calamine import CalamineWorkbook
- workbook = CalamineWorkbook.from_path("example.xlsx")
- sheet = workbook.get_sheet_by_name("Sheet1")
- for row in sheet.to_python():
- for cell in row:
- if isinstance(cell, str):
- print(f"字符串: {cell}")
- elif isinstance(cell, (int, float)):
- print(f"数字: {cell}")
- # 更多类型判断可参考官方文档
复制代码 注意:CalamineWorkbook的to_python()返回纯Python对象,无法直接区分原单元格类型(类型信息在底层存储)。如需类型判断,建议使用pandas引擎方式(见后文)。
3. 获取特定单元格值
如果已知单元格位置(如A1),可直接读取:- value = sheet.get_value("A1")
- print(value)
复制代码 需要先通过CalamineWorkbook获取工作表对象,再调用get_value()。
4. 进阶用法:与Pandas集成(推荐)
在pandas的read_excel中指定engine="calamine",即可享受calamine底层性能,同时保留pandas的全部数据分析能力:- import pandas as pd
- # 直接读取文件路径
- df = pd.read_excel("your_large_file.xlsx", engine="calamine")
- # 或通过文件对象(推荐,避免路径问题)
- with open("your_large_file.xlsx", "rb") as f:
- df = pd.read_excel(f, sheet_name="Sheet1", engine="calamine")
复制代码 还可结合usecols参数只读部分列以进一步提升性能:- 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引擎。它的轻量级设计使得集成成本极低,性能提升却非常显著。 |