使用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进阶教程之文本文件的读取和写入
Aug 29 Python
Python中计算三角函数之cos()方法的使用简介
May 15 Python
python模拟Django框架实例
May 17 Python
tornado 多进程模式解析
Jan 15 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
利用OpenCV和Python实现查找图片差异
Dec 19 Python
Python3.7+tkinter实现查询界面功能
Dec 24 Python
Django框架配置mysql数据库实现过程
Apr 22 Python
Python文件夹批处理操作代码实例
Jul 21 Python
python判断变量是否为列表的方法
Sep 17 Python
python搜索算法原理及实例讲解
Nov 18 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的变量总结 新手推荐
2011/04/18 PHP
php json与xml序列化/反序列化
2013/10/28 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
2014/06/25 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
JavaScript访问字符串中单个字符的两种方法
2015/07/03 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
2016/12/23 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
在Docker上开始部署Python应用的教程
2015/04/17 Python
Python简单实现enum功能的方法
2016/04/25 Python
python打包多类型文件的操作方法
2020/09/21 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
思想作风纪律整顿心得体会
2014/09/04 职场文书
2014年卫生工作总结
2014/11/27 职场文书
学期个人工作总结
2015/02/13 职场文书
地道战观后感300字
2015/06/04 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL