解决Python使用openpyxl读写大文件的坑

周末不加班
周末不加班
发布时间:2026-10-14| 3人浏览过
原创

本文针对Python使用openpyxl处理60MB以上Excel文件时遇到的写入报错及内存占用过高问题,提供了两种核心解决方案:手动释放内存与安装lxml依赖以启用流式处理。同时深入探讨了遍历大范围单元格导致的内存瓶颈,通过限制遍历范围至ZZ5000、切换X64环境及定时重新读取文件等策略,将内存占用控制在2G以内,实现了高效的数据对比与处理。

在处理xlsx格式文件时,我选择了openpyxl库。然而,当文件大小达到60多MB时,虽然读取过程稍显缓慢但仍能完成,但在尝试写入数据时却遇到了报错。

系统提示设备空间不足,经搜索发现,openpyxl处理大文件读写存在诸多已知问题。经过总结,主要解决方案包括以下两种,且我在实际操作中均采用了这些方法。

手动释放内存


del wb, ws
gc.collect()

该方法效果显著,在文件读取完成后,可以观察到内存占用率有明显下降。

安装lxml

通过执行命令 pip install lxml 来安装必要的依赖库。

虽然该依赖并非openpyxl的强制安装项,但它能够支持openpyxl进行数据的流式处理,从而提升大文件处理效率。

综合应用上述两种方案后,数据处理任务得以顺利完成。

补充:openpyxl读取大文件的若干问题

开发需求是编写一个用于对比EXCEL文件的工具。

典型的Excel文件大小约为8MB,包含约300个表格,每个表格的实际数据范围大致为ZZ500。

使用openpyxl遍历表格以进行两个文件间的对比,旨在找出公式不一致的单元格。在此过程中遇到了一些编程问题。

1、读取时报错,具体错误代码已遗忘。原因是通过数组方式读取了一个不存在的数值。

例如 SS['AA'],由于该数值未定义,导致报错(而在PHP中直接返回空值)。修改方法为使用 SS.get('AA', null) 进行兼容处理。

D:\Python34\Lib\site-packages\openpyxl\reader\style.py


164: format_code = builtin_formats.get(numFmtId,'General')

2、读取时内存占用过大

当内存占用超过2GB后,程序通常会停止响应。原因在于部分表格的识别范围过大,最大可达ZZ65535。

经过研究分析,对代码进行了如下修改:

1:改用X64版本。X64版本在运行时可支持4GB以内的内存占用,相比2GB版本容量翻倍,能够完成大部分如ZZ5000范围的表格读取。但若遇到ZZ65535这样的大范围表格,内存占用仍会超过4GB,导致程序停止运行。

2:限制最大单元格遍历范围,将上限设定为ZZ5000。这一措施能有效降低内存占用。

3:实施定时重新读取EXCEL文件的策略(例如每对比30张表后执行一次),以释放内存。需要注意的是,Python的内存释放机制较为特殊,全部涉及指针引用,执行 A=B 后,仅 DEL A 不会释放空间,必须执行 DEL B 才能完成释放。

4:尽管openpyxl提供了只读模式(性能模式),但其运行速度过于缓慢。

经过代码优化,目前完成文件对比所需的内存通常保持在2GB以内。

以上为个人实践经验总结,希望能提供参考。欢迎大家支持本站,如有错误或考虑不周之处,敬请指正。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。