解决python执行较大excel文件openpyxl慢问题


Posted in Python onMay 15, 2020

我就废话不多说了,大家还是直接看代码吧!

talk is cheap

from openpyxl import Workbook
  from openpyxl.utils import get_column_letter
  from openpyxl import load_workbook
  import time
  wb = load_workbook("E:/a.xlsx", read_only=True)
  sh = wb["Sheet"]
  # rowItem = {}
  # for j in range(1,2000):
  #   for i in range(1, 30):
  #     rowItem[get_column_letter(i)] = i
  #   sh.append(rowItem)
  # wb.save("E:/a.xlsx")
  t0 = time.time()
  print(sh['V500'].value)
  t1 = time.time()
  print("openpyxl所用时间:", str(t1-t0))

  import xlrd
  xlsPath = "E:/a.xlsx"
  WorkBook = xlrd.open_workbook(xlsPath)
  sh = WorkBook.sheet_by_name("Sheet")

  t0 = time.time()
  print(sh.cell(499,22).value)
  t1 = time.time()
  print("xlrd所用时间:", str(t1-t0))

测试结果:

22
openpyxl所用时间: 0.44217610359191895
23.0
xlrd所用时间: 0.0010063648223876953

结论

openpyxl的慢是读取慢,可以选择xlrd代替,详细测试下面继续

不直接使用xlwt+xlrd是因为xlwt仅支持2003及以下版本,最大行数限制在65536,不够用,而openpyxl大概在一百多万

主要的说完了,下面详细说了:在写工具的时候遇到的这个问题,开始是用的xlwt+xlrd,然后行数超标了,没办法换成openpyxl使用excel2007的版本,原本测试不到三万行的数据,只要三四秒,换成openpyxl以后,花了好几分钟,具体没看多少了,然后加上函数运行时间的监视器以后,才看到是读取的时候出的问题

推测原因:

推测的话,openpyxl的根据行号列号读取的时候,是从第一行第一列开始遍历,直到行号等于指定行号,列号等于指定列号,所以要读取的行号列号越多就越慢,(也可能是从第一个有数据的行或列),而xlrd则是类似与数组一样,我们要取第几个元素,直接根据下标找到内存中对应地址的元素即可,所以无论excel总量多少,速度基本都是不变的

留下的坑

xlwt写入仅支持65536行,那xlrd的读取很可能也是,也就是超过这么多的数据可能也会出错

我这里因为是读多表数据生成单表数据,生成方式大概是Na*Nb这样,所以实际读取的不会太多,但生成的很多,所以基本可以用考虑这个问题

另外,据说xlrd读取xlsx格式的偶尔会出现问题,具体没测试,暂时用还没毛病

最后,顺带上一下监控函数运行时间的装饰器吧:

import time
from functools import wraps

def fn_timer(function):
  @wraps(function)
  def function_timer(*args, **kwargs):
    t0 = time.time()
    result = function(*args, **kwargs)
    t1 = time.time()
    print ("Total time running %s: %s seconds" %
      (function.__name__, str(t1-t0))
      )
    return result
  return function_timer

使用方式的话,就是在要监控的函数定义上面加上 @fn_timer 就行了

以上这篇解决python执行较大excel文件openpyxl慢问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 实现自动远程登陆scp文件实例代码
Mar 13 Python
python使用xslt提取网页数据的方法
Feb 23 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
对python模块中多个类的用法详解
Jan 10 Python
python基础梳理(一)(推荐)
Apr 06 Python
Python Django给admin添加Action的方法实例详解
Apr 29 Python
python tkinter实现彩球碰撞屏保
Jul 30 Python
Python高级特性——详解多维数组切片(Slice)
Nov 26 Python
Python实现将蓝底照片转化为白底照片功能完整实例
Dec 13 Python
Python 项目转化为so文件实例
Dec 23 Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 Python
用Python提取PDF表格的方法
Apr 11 Python
python可迭代对象去重实例
May 15 #Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 #Python
Python实现UDP程序通信过程图解
May 15 #Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 #Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
May 15 #Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
May 15 #Python
django 利用Q对象与F对象进行查询的实现
May 15 #Python
You might like
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
php结合js实现点击超链接执行删除确认操作
2014/10/31 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
用JavaScript显示随机图像或引用
2009/04/21 Javascript
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
在JavaScript里防止事件函数高频触发和高频调用的方法
2014/09/06 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
详解js中==与===的区别
2017/01/08 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
基python实现多线程网页爬虫
2015/09/06 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
关于python2 csv写入空白行的问题
2018/06/22 Python
python3.5绘制随机漫步图
2018/08/27 Python
Python实现多属性排序的方法
2018/12/05 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
Python实现加密的RAR文件解压的方法(密码已知)
2020/09/11 Python
Python list和str互转的实现示例
2020/11/16 Python
大四学年自我鉴定
2013/11/13 职场文书
房地产营销策划方案
2014/02/08 职场文书
《手指教学》反思
2014/02/14 职场文书
兽医医药专业求职信
2014/07/27 职场文书
任命书怎么写
2015/03/02 职场文书
农村党员干部承诺书
2015/05/04 职场文书
2016母亲节感恩话语
2015/12/09 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
Oracle 触发器trigger使用案例
2022/02/24 Oracle