解决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 相关文章推荐
Python3访问并下载网页内容的方法
Jul 28 Python
一键搞定python连接mysql驱动有关问题(windows版本)
Apr 23 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
Aug 30 Python
Python上下文管理器和with块详解
Sep 09 Python
TensorFlow变量管理详解
Mar 10 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
PyQt5显示GIF图片的方法
Jun 17 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
Aug 15 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
Python使用matplotlib 画矩形的三种方式分析
Oct 31 Python
解决jupyter notebook 前面书写后面内容消失的问题
Apr 13 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中的日期处理方法集锦
2007/01/02 PHP
Smarty Foreach 使用说明
2010/03/23 PHP
php header Content-Type类型小结
2011/07/03 PHP
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
javascript hasFocus使用实例
2010/06/29 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
js 为label标签和div标签赋值的方法
2013/08/08 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
浅析2种JavaScript继承方式
2015/12/04 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
举例讲解Python中的算数运算符的用法
2015/05/13 Python
Python随机生成带特殊字符的密码
2016/03/02 Python
wxpython中自定义事件的实现与使用方法分析
2016/07/21 Python
详解Python如何获取列表(List)的中位数
2016/08/12 Python
python中OrderedDict的使用方法详解
2017/05/05 Python
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
Python爬取知乎图片代码实现解析
2019/09/17 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
简单掌握CSS3将文字描边及填充文字颜色的方法
2016/03/07 HTML / CSS
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
英文版银行求职信
2013/10/09 职场文书
师范生实习的个人自我鉴定
2013/10/20 职场文书
个人近期表现材料
2014/02/11 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
国庆节慰问信
2015/02/15 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
2019年预备党员的思想汇报:加深对党的认知
2019/09/25 职场文书
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫