解决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 Web框架Flask信号机制(signals)介绍
Jan 01 Python
python数组复制拷贝的实现方法
Jun 09 Python
Python中的变量和作用域详解
Jul 13 Python
微信 用脚本查看是否被微信好友删除
Oct 28 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
Nov 30 Python
Python3.6使用tesseract-ocr的正确方法
Oct 17 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
在Python3 numpy中mean和average的区别详解
Aug 24 Python
DataFrame.to_excel多次写入不同Sheet的实例
Dec 02 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
Oct 14 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二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
PHP编程求最大公约数与最小公倍数的方法示例
2017/05/29 PHP
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
基于JavaScript实现百叶窗动画效果不只单纯flas可以实现
2016/02/29 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
JQuery 实现文件下载的常用方法分析
2019/10/29 jQuery
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
python正则表达式re之compile函数解析
2017/10/25 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
使用PyCharm进行远程开发和调试的实现
2019/11/04 Python
python 实现字符串下标的输出功能
2020/02/13 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
介绍一下Linux文件的记录形式
2013/09/29 面试题
文员岗位职责
2013/11/09 职场文书
标准化管理实施方案
2014/02/25 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
预备党员自我评价范文
2015/03/04 职场文书
少先队工作总结2015
2015/05/13 职场文书