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

 更新时间:2021年03月13日 09:47:39   作者:valark  
这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

由于需要处理xlsx类型的文件,我使用了openpyxl来处理,然而文件比较大,大约有60多MB。读文件的时候虽然慢了一点,但还是能够读出来,但是当我想写入时却报错了。

显示设备没有多余的空间,百度了一下,发现有不少关于openpyxl读写大文件的问题。总结来看,解决方案主要有以下两种,当然,我两种都用上了。

手动释放内存

del wb, ws
gc.collect()

这一招还算有用,在读完文件后可以看到内存占用明显下降了一点。

安装lxml

使用命令·pip install lxml安装依赖

这个依赖并非必须安装的依赖,但是可以使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、读取时内存占用过大

基本就是内存占用了2G以上以后,程序就不动了,原因是某些表格的表格范围识别的非常大,最大可为ZZ65535

通过研究,代码进行了如下修改

1:使用X64版本,X64版本在运行时,可以运行4G以内内存占用的程序,比2G大一倍,能够完成大部分表格的读取,如ZZ5000,但是遇到ZZ65535范围的表格,内存占用达到了4G+,也会导致程序停止运行.

2:限制最大单元格遍历范围,最大限制为ZZ5000,能够有效降低内存占用

3:定时重新读取EXCEL文件(如每对比30张表),释放内存,(Python内存释放真的很痛苦,全部是指针引用,A=B,DEL A;是不会释放空间的,要DEL B才行).

4:虽然openpyxl读取文件时有个只读模式(性能模式),但是速度实在是太慢了.

通过代码修改,现在完成文件对比所用的内存通常在2G以内

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • 使用Django实现文章与多个标签关联的示例详解

    使用Django实现文章与多个标签关联的示例详解

    在构建一个博客或内容管理系统时,经常需要实现文章与标签的关联,在 Django 中,我们可以利用 ManyToManyField 来实现文章与标签的多对多关系,在本文中,我们将详细探讨如何使用 Django 模型实现文章与多个标签的关联,需要的朋友可以参考下
    2023-11-11
  • python实现按日期归档文件

    python实现按日期归档文件

    这篇文章主要介绍了python实现如何按日期归档文件,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-01-01
  • Python上下文管理器Content Manager

    Python上下文管理器Content Manager

    在Python中,我们会经常听到上下文管理器,那么上下文管理器到底是干什么的,本文就来介绍一下,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Ranorex通过Python将报告发送到邮箱的方法

    Ranorex通过Python将报告发送到邮箱的方法

    这篇文章主要介绍了Ranorex通过Python将报告发送到邮箱的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • python中numpy数组与list相互转换实例方法

    python中numpy数组与list相互转换实例方法

    在本篇文章里小编给大家整理的是一篇关于python中numpy数组与list相互转换实例方法,对此有兴趣的朋友们可以学习下。
    2021-01-01
  • Python pytesseract验证码识别库用法解析

    Python pytesseract验证码识别库用法解析

    这篇文章主要介绍了Python pytesseract验证码识别库用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 基于Python的ModbusTCP客户端实现详解

    基于Python的ModbusTCP客户端实现详解

    这篇文章主要介绍了基于Python的ModbusTCP客户端实现详解,Modbus Poll和Modbus Slave是两款非常流行的Modbus设备仿真软件,支持Modbus RTU/ASCII和Modbus TCP/IP协议 ,经常用于测试和调试Modbus设备,观察Modbus通信过程中的各种报文,需要的朋友可以参考下
    2019-07-07
  • python入门游戏之井字棋实例代码

    python入门游戏之井字棋实例代码

    python井字棋游戏虽然看上去非常简陋,但是却非常值得学习,下面这篇文章主要给大家介绍了关于python入门游戏之井字棋的相关资料,需要的朋友可以参考下
    2021-11-11
  • Python request post上传文件常见要点

    Python request post上传文件常见要点

    这篇文章主要介绍了Python request post上传文件常见要点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Linux下Python安装完成后使用pip命令的详细教程

    Linux下Python安装完成后使用pip命令的详细教程

    这篇文章主要介绍了Linux下Python安装完成后使用pip命令的详细教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11

最新评论