使用Python快速打开一个百万行级别的超大Excel文件的方法
知乎上有同学求助说,当他试图打开一个20M左右的excel文件时,无论是使用pandas的read_excel,还是直接使用xlrd或者openpyxl模块,速度都慢到无法忍受的程度,耗时大约1分钟左右。
真的会这样吗?第一感觉是,这位同学在使用openpyxl模块时没有设置只读模式。为便于测试,先用下面的代码生成一个一百万行数据的excel文件。
>>>fromopenpyxlimportWorkbook >>>wb=Workbook() >>>sh=wb.active >>>sh.append(['id','语文','数学','英语','物理']) >>>foriinrange(1000000):#写入100万行数据 sh.append([i+1,90,100,95,99]) >>>wb.save(r'd:\bigxlsx.xlsx') >>>importos >>>os.path.getsize(r'd:\bigxlsx.xlsx')#文件大小:20M字节 20230528
接下来定义了一个使用openpyxl模块打开文件的函数,分别考察关闭和开启只读模式的时间消耗。
>>>fromopenpyxlimportload_workbook >>>importtime >>>defread_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秒钟。下面的代码验证了这一点。
>>>importpandasaspd >>>defread_excel_by_pandas(): withopen(r'd:\bigxlsx.xlsx','rb')asfp: 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语文数学英语物理 01901009599 12901009599 23901009599 34901009599 45901009599 id语文数学英语物理 999995999996901009599 999996999997901009599 999997999998901009599 999998999999901009599 9999991000000901009599 耗时81.369秒钟
结论:处理超大的Excel文件时,使用openpyxl模块的只读模式,可以快速打开并取得指定格子的数据,但不要尝试将全部数据读入到自己定义的数据结构中,这将花费漫长的时间。对此,pandas也无能为力。
到此这篇关于使用Python快速打开一个百万行级别的超大Excel文件的方法的文章就介绍到这了,更多相关python打开excel文件内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。