解决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按照多个字符对字符串进行分割的方法
Mar 17 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
Dec 12 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
Mar 19 Python
基于python中的TCP及UDP(详解)
Nov 06 Python
python使用PIL模块获取图片像素点的方法
Jan 08 Python
浅析Python 实现一个自动化翻译和替换的工具
Apr 14 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
Oct 14 Python
Python3 中sorted() 函数的用法
Mar 24 Python
python自动下载图片的方法示例
Mar 25 Python
解决keras使用cov1D函数的输入问题
Jun 29 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+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
php数组使用规则分析
2015/02/27 PHP
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
jquery 实现上下滚动效果示例代码
2013/08/09 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
基于wxpython实现的windows GUI程序实例
2015/05/30 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
Python3 翻转二叉树的实现
2019/09/30 Python
用Python 爬取猫眼电影数据分析《无名之辈》
2020/07/24 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
青年教师培训方案
2014/02/06 职场文书
黄河象教学反思
2014/02/10 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
交通事故调解协议书
2015/05/20 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
mysql函数全面总结
2021/11/11 MySQL
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis