使用Python快速打开一个百万行级别的超大Excel文件的方法
使⽤Python快速打开⼀个百万⾏级别的超⼤Excel⽂件的
⽅法
知乎上有同学求助说,当他试图打开⼀个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
>>> size(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()打开excel很慢
print(wb.sheetnames)
ll(row=1, column=1).value)
ll(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模块并没有提供像ad_excel()那样把全部数据读⼊⼀个数据结构的功能,只能定位到⾏、列或格⼦以后再读取数据。要想使⽤openpyxl模块把全部数据读⼊到数组或DataFrame中,需要遍历所有的⾏和列,这仍然是⼀个⾮常耗时的操作。
那么,ad_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⽂件内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。