使用Python快速打开一个百万行级别的超大Excel文件的方法


Posted in Python onMarch 02, 2021

知乎上有同学求助说,当他试图打开一个20M左右的excel文件时,无论是使用pandas的read_excel,还是直接使用xlrd或者openpyxl模块,速度都慢到无法忍受的程度,耗时大约1分钟左右。

真的会这样吗?第一感觉是,这位同学在使用openpyxl模块时没有设置只读模式。为便于测试,先用下面的代码生成一个一百万行数据的excel文件。

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> sh = wb.active
>>> sh.append(['id', '语文', '数学', '英语', '物理'])
>>> for i in range(1000000): # 写入100万行数据
	sh.append([i+1, 90, 100, 95, 99])

	
>>> wb.save(r'd:\bigxlsx.xlsx')
>>> import os
>>> os.path.getsize(r'd:\bigxlsx.xlsx') # 文件大小:20M字节
20230528

接下来定义了一个使用openpyxl模块打开文件的函数,分别考察关闭和开启只读模式的时间消耗。

>>> from openpyxl import load_workbook
>>> import time
>>> def read_xlsx(read_only):
	t0 = time.time()
	wb = load_workbook(r'd:\bigxlsx.xlsx', read_only=read_only)
	t1 = time.time()
	print(wb.sheetnames)
	print(sh.cell(row=1, column=1).value)
	print(sh.cell(row=100, column=3).value)
	print('耗时%0.3f秒钟'%(t1-t0))

	
>>> read_xlsx(True)
['Sheet']
id
100
耗时0.404秒钟
>>> read_xlsx(False)
['Sheet']
id
100
耗时67.817秒钟

运行测试,果然,不开启只读的话,真的需要1分多钟,而使用只读模式的话,则仅需0.4秒钟。

不过,也别高兴得太早,openpyxl模块并没有提供像pandas.read_excel()那样把全部数据读入一个数据结构的功能,只能定位到行、列或格子以后再读取数据。要想使用openpyxl模块把全部数据读入到数组或DataFrame中,需要遍历所有的行和列,这仍然是一个非常耗时的操作。

那么,pandas.read_excel()是否也支持只读模式呢?遗憾的是,read_excel()并没有类似read_only这样的参数。尽管read_excel()可以接受文件路径、文件对象、类文件对象,甚至是二进制数据,但即使将文件内容传入,read_excel()解析这100万行数据仍然需要大约80秒钟。下面的代码验证了这一点。

>>> import pandas as pd
>>> def read_excel_by_pandas():	
	with open(r'd:\bigxlsx.xlsx', 'rb') as fp:
		content = fp.read()
		t0 = time.time()
		df = pd.read_excel(content, engine='openpyxl')
		t1 = time.time()
	print(df.head())
	print(df.tail())
	print('耗时%0.3f秒钟'%(t1-t0))

	
>>> read_excel_by_pandas()
  id 语文  数学 英语 物理
0  1 90 100 95 99
1  2 90 100 95 99
2  3 90 100 95 99
3  4 90 100 95 99
4  5 90 100 95 99
       id 语文  数学 英语 物理
999995  999996 90 100 95 99
999996  999997 90 100 95 99
999997  999998 90 100 95 99
999998  999999 90 100 95 99
999999 1000000 90 100 95 99
耗时81.369秒钟

结论:处理超大的Excel文件时,使用openpyxl模块的只读模式,可以快速打开并取得指定格子的数据,但不要尝试将全部数据读入到自己定义的数据结构中,这将花费漫长的时间。对此,pandas也无能为力。

到此这篇关于使用Python快速打开一个百万行级别的超大Excel文件的方法的文章就介绍到这了,更多相关python打开excel文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python循环监控远程端口的方法
Mar 14 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
Jun 26 Python
对Python中range()函数和list的比较
Apr 19 Python
Numpy中的mask的使用
Jul 21 Python
Python实现爬取马云的微博功能示例
Feb 16 Python
Python学习笔记之图片人脸检测识别实例教程
Mar 06 Python
python3使用matplotlib绘制条形图
Mar 25 Python
使用Python进行中文繁简转换的实现代码
Oct 18 Python
python如何使用socketserver模块实现并发聊天
Dec 14 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
如何利用python检测图片是否包含二维码
Oct 15 Python
python实现KNN近邻算法
Dec 30 Python
Autopep8的使用(python自动编排工具)
Mar 02 #Python
python 将Excel转Word的示例
Mar 02 #Python
Python字节单位转换(将字节转换为K M G T)
Mar 02 #Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 02 #Python
jupyter notebook指定启动目录的方法
Mar 02 #Python
python实现发送邮件
Mar 02 #Python
matplotlib阶梯图的实现(step())
Mar 02 #Python
You might like
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
JavaScript 事件参考手册
2008/12/24 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
jquery-easyui关闭tab自动切换到前一个tab
2010/07/29 Javascript
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
node.js中的console.info方法使用说明
2014/12/09 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
js实现双色球效果
2020/08/02 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
一个Python最简单的接口自动化框架
2018/01/02 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
python的debug实用工具 pdb详解
2019/07/12 Python
Django实现web端tailf日志文件功能及实例详解
2019/07/28 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
python redis存入字典序列化存储教程
2020/07/16 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
Python如何使用ConfigParser读取配置文件
2020/11/12 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
2021/03/01 Python
浅谈HTML5 服务器推送事件(Server-sent Events)
2017/08/01 HTML / CSS
求职简历自我评价怎么写
2015/03/10 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis