找回密码
 会员注册
查看: 23|回复: 0

Python中读取Excel最快的6种方法

[复制链接]

5

主题

0

回帖

16

积分

新手上路

积分
16
发表于 2024-9-6 14:29:54 | 显示全部楼层 |阅读模式
在本文中,比较了从Python读取Excel的几种方法:1、使用Pandas读取ExcelPandas是Python的数据分析库,是用Python处理与数据有关的任何问题的首选,因此是一个很好的开始。importpandasdefiter_excel_pandas(file:IO[bytes])->Iterator[dict[str,object]]:yieldfrompandas.read_excel(file).to_dict(‘records’)只需将两条命令串联起来,就能从Excel文件中获取字典列表。这是结果中的一行:>>>withopen(‘file.xlsx’,‘rb’)asf:…rows=iter_excel_pandas(f)…row=next(rows)…print(row)…{‘boolean’:True,‘date’:Timestamp(‘2000-01-0100:00:00’),‘decimal’:1.1,‘number’:1,‘text’:‘CONTROLROW’}2、使用Tablib读取ExcelTablib是Python中最流行的库之一,用于导入和导出各种格式的数据。它最初是由流行requests库的创建者开发的,因此其特点是同样关注开发人员体验和人体工程学。安装:$pipinstalltablib代码:importtablibdefiter_excel_tablib(file:IO[bytes])->Iterator[dict[str,object]]:yieldfromtablib.Dataset().load(file).dict只需一行代码,该库就能完成所有繁重的工作。在继续执行基准测试之前,我们先看看第一行的结果:>>>withopen(‘file.xlsx’,‘rb’)asf:…rows=iter_excel_tablib(f)…row=next(rows)…print(row)…OrderedDict([(‘number’,1),(‘decimal’,1.1),(‘date’,datetime.datetime(2000,1,1,0,0)),(‘boolean’,True),(‘text’,‘CONTROLROW’)])[OrderedDict](https://docs.python.org/3/library/collections.htmlcollections.OrderedDict)是Python的子类,dict具有一些额外的方法来重新排列字典顺序。它是在内置collections模块中定义的,当您请求字典时,它就是tablib返回的内容。由于OrderedDict是的子类dict并且它是在内置模块中定义的,因此我们不介意并认为它足以满足我们的目的。3、使用Openpyxl读取ExcelOpenpyxl是一个用Python读写Excel文件的库。与Tablib不同,Openpyxl仅专用于Excel,不支持任何其他文件类型。事实上,tablib和pandas在读取xlsx文件时都在底层使用Openpyxl。也许这种专业化会带来更好的表现。安装:$pipinstallopenpyxl代码:importopenpyxldefiter_excel_openpyxl(file:IO[bytes])->Iterator[dict[str,object]]:workbook=openpyxl.load_workbook(file)rows=workbook.active.rowsheaders=[str(cell.value)forcellinnext(rows)]forrowinrows:yielddict(zip(headers,(cell.valueforcellinrow)))这次我们要写的代码更多一些,让我们来分解一下:从打开的文件中加载工作簿:函数load_workbook同时支持文件路径和可读数据流。在本例中,我们对打开的文件进行操作。获取活动工作表:Excel文件可以包含多个工作表,我们可以选择读取哪个工作表。在本例中,我们只有一张工作表。构建页眉列表:Excel文件的第一行包含页眉。要将这些页眉作为字典的键,我们需要读取第一行并生成页眉列表。返回结果:openpyxl使用的单元格类型包含值和一些元数据。这对其他用途很有用,但我们只需要值。要访问单元格的值,我们使用cell.value。输出:>>>withopen(‘file.xlsx’,‘rb’)asf:…rows=iter_excel_openpyxl(f)…row=next(rows)…print(row){‘boolean’:True,‘date’:datetime.datetime(2000,1,1,0,0),‘decimal’:1.1,‘number’:1,‘text’:‘CONTROLROW’}4、使用LibreOffice读取Excel我们现在已经用尽了将Excel导入Python的传统且显而易见的方法。我们使用了顶级指定库并获得了不错的结果。现在是跳出框框思考的时候了。LibreOffice是其他办公套件的免费开源替代品。LibreOffice可以处理xls和xlsx文件,并且还恰好包含带有一些有用的命令行选项的无头模式:LibreOffice命令行选项之一是在不同格式之间转换文件。例如,我们可以使用libreoffice将xlsx文件转换为csv文件:$libreoffice--headless--convert-tocsv--outdir.file.xlsxconvertfile.xlsx->file.csvusingfilter:Text-txt-csv(StarCalc)$headfile.csvnumber,decimal,date,boolean,text1,1.1,01/01/2000,TRUE,CONTROLROW2,1.2,01/02/2000,FALSE,RANDOMTEXT:0.7166589890246923,1.3,01/03/2000,TRUE,RANDOMTEXT:0.966075283958641不错!让我们用Python将其拼接起来。我们首先将xlsx文件转换为CSV,然后将CSV导入Python:importsubprocess,tempfile,csvdefiter_excel_libreoffice(file:IO[bytes])->Iterator[dict[str,object]]:withtempfile.TemporaryDirectory(prefix=‘excelbenchmark’)astempdir:subprocess.run([‘libreoffice’,‘–headless’,‘–convert-to’,‘csv’,‘–outdir’,tempdir,file.name,])withopen(f’{tempdir}/{file.name.rsplit(“.”)[0]}.csv’,‘r’)asf:rows=csv.reader(f)headers=list(map(str,next(rows)))forrowinrows:yielddict(zip(headers,row))让我们来分析一下:创建一个用于存储CSV文件的临时目录:使用内置的tempfile模块创建一个临时目录,完成后会自动清理。理想情况下,我们希望将特定文件转换为内存中的类文件对象,但libreoffice命令行不提供转换为特定文件的方法,只能转换为目录。使用libreoffice命令行将文件转换为CSV:使用内置子进程模块执行操作系统命令。读取生成的CSV:打开新创建的CSV文件,使用内置的csv模块进行解析并生成dicts。5、使用DuckDB读取Excel如果我们已经开始使用外部工具,为什么不给新人一个竞争的机会呢?DuckDB是一个“进程内SQLOLAP数据库管理系统”。此描述并没有立即说明为什么DuckDB在这种情况下有用,但确实如此。DuckDB非常擅长移动数据和格式之间的转换。安装:$pipinstallduckdb代码:importduckdbdefiter_excel_duckdb(file:IO[bytes])->Iterator[dict[str,object]]:duckdb.install_extension(‘spatial’)duckdb.load_extension(‘spatial’)rows=duckdb.sql(f"“”SELECT*FROMst_read(‘{file.name}’,open_options=[‘HEADERS=FORCE’,‘FIELD_TYPES=AUTO’])“”")whilerow:=rows.fetchone():yielddict(zip(rows.columns,row))让我们来分析一下:安装并加载空间扩展:要使用duckdb从Excel中导入数据,需要安装空间扩展。这有点奇怪,因为空间扩展用于地理操作,但这正是它想要的。查询文件:直接使用duckdb全局变量执行查询时,默认情况下会使用内存数据库,类似于使用:memory:选项的sqlite。要实际导入Excel文件,我们使用st_read函数,并将文件路径作为第一个参数。在函数选项中,我们将第一行设置为,并激活自动检测类型的选项(这也是默认选项)。构建结果遍历每一行,并使用每一行的和值列表构建dict。6、使用Calamine读取Excel近年来,Python中的每个性能问题似乎最终都用另一种语言来解决。作为一名Python开发人员,我认为这是一个真正的祝福。这意味着我可以继续使用我习惯的语言并享受所有其他语言的性能优势!Calamine是一个纯Rust库,用于读取Excel和OpenDocument电子表格文件。要安装python-calamine(炉甘石的Python绑定),请执行以下命令:$pipinstallpython-calamine代码:importpython_calaminedefiter_excel_calamine(file:IO[bytes])->Iterator[dict[str,object]]:workbook=python_calamine.CalamineWorkbook.from_filelike(file)#type:ignore[arg-type]rows=iter(workbook.get_sheet_by_index(0).to_python())headers=list(map(str,next(rows)))forrowinrows:yielddict(zip(headers,row))性能总结总结一下使用Python读取Excel文件的方法以及读取Excel花费的时间:Pandas32.98Tablib28.52Openpyxl35.62Openpyxl(readonly)24.79LibreOffice15.27DuckDB(sql)11.36DuckDB(execute)5.73Calamine(python-calamine)3.58那么您应该使用哪一个呢?这取决于…在选择在Python中处理Excel文件的库时,除了速度之外,还有一些其他考虑因素:写入能力:我们对读取Excel的方法进行了基准测试,但有时也需要生成Excel文件。我们进行基准测试的一些库不支持写入。例如Calamine,不能写入Excel文件,只能读取。其他格式:系统可能需要加载和生成Excel以外的其他格式的文件。一些库,例如pandas和Tablib支持多种附加格式,而calamine和openpyxl仅支持Excel。以上就是“Python中读取Excel最快的6种方法”的全部内容,希望对你有所帮助。​​关于Python技术储备学好Python不论是就业还是做副业赚钱都不错,但要学会Python还是要有一个学习规划。最后大家分享一份全套的Python学习资料,给那些想学习Python的小伙伴们一点帮助!一、Python所有方向的学习路线Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。二、Python必备开发工具三、Python视频合集观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。四、实战案例光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。五、Python练习题检查学习结果。六、面试资料我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。最后祝大家天天进步!!上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 05:53 , Processed in 0.476406 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表