Python中讀取Excel最快的幾種常見方法
前言
在數(shù)據(jù)分析和處理的日常工作中,Excel文件是一種非常常見的數(shù)據(jù)存儲(chǔ)格式。Python,作為一種功能強(qiáng)大的編程語言,提供了多種庫來幫助用戶輕松讀取Excel文件。本文將介紹幾種使用Python讀取Excel文件的常見方法。
1. 使用pandas讀取Excel文件
pandas是Python數(shù)據(jù)分析領(lǐng)域中最受歡迎的庫之一,它提供了read_excel函數(shù)來直接讀取Excel文件。
import pandas as pd # 讀取Excel文件 df = pd.read_excel('example.xlsx') # 顯示前幾行數(shù)據(jù) print(df.head())
這種方法簡單快捷,非常適合進(jìn)行數(shù)據(jù)分析工作。pandas支持讀取.xls和.xlsx格式的文件,并且可以通過參數(shù)指定特定的工作表和單元格范圍。
2. 使用openpyxl讀取Excel文件
openpyxl是另一個(gè)強(qiáng)大的庫,專門用于讀寫.xlsx文件。與pandas不同,openpyxl允許用戶以更細(xì)粒度的方式操作Excel文件,例如讀取或編輯單元格格式。
from openpyxl import load_workbook # 加載Excel文件 wb = load_workbook('example.xlsx') # 選擇工作表 sheet = wb.active # 讀取特定單元格的數(shù)據(jù) cell_value = sheet['A1'].value print(cell_value)
openpyxl是處理復(fù)雜Excel文件的理想選擇,比如需要讀取或設(shè)置單元格的格式、公式等。
3. 使用xlrd和xlwt讀取Excel文件
對(duì)于較舊版本的.xls文件,xlrd和xlwt庫提供了讀取和寫入的功能。雖然它們不支持.xlsx格式的文件,但對(duì)于需要處理遺留數(shù)據(jù)的情況非常有用。
import xlrd # 打開文件 workbook = xlrd.open_workbook('example.xls') # 選擇工作表 sheet = workbook.sheet_by_index(0) # 讀取特定單元格的內(nèi)容 cell_value = sheet.cell_value(0, 0) print(cell_value)
盡管xlrd最新版本已經(jīng)限制了對(duì).xlsx文件的支持,但它仍然是處理.xls文件的有效工具。
4. 使用pyexcel作為一個(gè)統(tǒng)一的接口
pyexcel提供了一個(gè)簡單的API來讀取、處理和寫入多種不同格式的Excel文件。如果你在尋找一個(gè)統(tǒng)一的接口來處理不同類型的Excel文件,pyexcel可能是一個(gè)不錯(cuò)的選擇。
import pyexcel as p # 讀取Excel文件 data = p.get_records(file_name='example.xlsx') for record in data: print(record)
pyexcel支持.xls、.xlsx、.xlsm等多種格式,使其成為處理不同類型Excel文件的便捷工具。
5.使用 Tablib 讀取 Excel
Tablib是 Python 中最流行的庫之一,用于導(dǎo)入和導(dǎo)出各種格式的數(shù)據(jù)。它最初是由流行requests庫的創(chuàng)建者開發(fā)的,因此其特點(diǎn)是同樣關(guān)注開發(fā)人員體驗(yàn)和人體工程學(xué)。
安裝:
$ pip install tablib
代碼:
**import** tablib def iter\_excel\_tablib(file: IO\[bytes\]) -> Iterator\[dict\[str, object\]\]: yield from tablib.Dataset().load(file).dict
只需一行代碼,該庫就能完成所有繁重的工作。
在繼續(xù)執(zhí)行基準(zhǔn)測(cè)試之前,我們先看看第一行的結(jié)果:
with open(‘file.xlsx’, ‘rb’) as f:
… 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’, ‘CONTROL ROW’)])
OrderedDict是 Python 的子類,dict具有一些額外的方法來重新排列字典順序。它是在內(nèi)置collections模塊中定義的,當(dāng)您請(qǐng)求字典時(shí),它就是 tablib 返回的內(nèi)容。由于OrderedDict是 的子類dict并且它是在內(nèi)置模塊中定義的,因此我們不介意并認(rèn)為它足以滿足我們的目的。
6.使用 Openpyxl 讀取 Excel
Openpyxl是一個(gè)用 Python 讀寫 Excel 文件的庫。與 Tablib 不同,Openpyxl 僅專用于 Excel,不支持任何其他文件類型。
事實(shí)上,tablib和pandas在讀取 xlsx 文件時(shí)都在底層使用 Openpyxl。也許這種專業(yè)化會(huì)帶來更好的表現(xiàn)。
安裝:
$ pip install openpyxl
代碼:
**import** openpyxl def iter\_excel\_openpyxl(file: IO\[bytes\]) -> Iterator\[dict\[str, object\]\]: workbook = openpyxl.load\_workbook(file) rows = workbook.active.rows headers = \[str(cell.value) **for** cell in next(rows)\] **for** row in rows: yield dict(zip(headers, (cell.value **for** cell in row)))
這次我們要寫的代碼更多一些,讓我們來分解一下:
- 從打開的文件中加載工作簿:函數(shù) load_workbook 同時(shí)支持文件路徑和可讀數(shù)據(jù)流。在本例中,我們對(duì)打開的文件進(jìn)行操作。
- 獲取活動(dòng)工作表:Excel 文件可以包含多個(gè)工作表,我們可以選擇讀取哪個(gè)工作表。在本例中,我們只有一張工作表。
- 構(gòu)建頁眉列表:Excel 文件的第一行包含頁眉。要將這些頁眉作為字典的鍵,我們需要讀取第一行并生成頁眉列表。
- 返回結(jié)果:openpyxl 使用的單元格類型包含值和一些元數(shù)據(jù)。這對(duì)其他用途很有用,但我們只需要值。要訪問單元格的值,我們使用 cell.value。
輸出:
with open(‘file.xlsx’, ‘rb’) as f:
… 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’: ‘CONTROL ROW’}
7.使用 LibreOffice 讀取 Excel
我們現(xiàn)在已經(jīng)用盡了將 Excel 導(dǎo)入 Python 的傳統(tǒng)且顯而易見的方法。我們使用了頂級(jí)指定庫并獲得了不錯(cuò)的結(jié)果?,F(xiàn)在是跳出框框思考的時(shí)候了。
LibreOffice是其他辦公套件的免費(fèi)開源替代品。LibreOffice 可以處理 xls 和 xlsx 文件,并且還恰好包含帶有一些有用的命令行選項(xiàng)的無頭模式:
LibreOffice 命令行選項(xiàng)之一是在不同格式之間轉(zhuǎn)換文件。例如,我們可以使用 libreoffice 將 xlsx 文件轉(zhuǎn)換為 csv 文件:
$ libreoffice --headless --convert-to csv --outdir . file.xlsx convert file.xlsx -> file.csv using filter: Text - txt - csv (StarCalc) $ head file.csv number,decimal,date,**boolean**,text 1,1.1,01/01/2000,TRUE,CONTROL ROW 2,1.2,01/02/2000,FALSE,RANDOM TEXT:0.716658989024692 3,1.3,01/03/2000,TRUE,RANDOM TEXT:0.966075283958641
讓我們用 Python 將其拼接起來。我們首先將 xlsx 文件轉(zhuǎn)換為 CSV,然后將 CSV 導(dǎo)入 Python:
**import** subprocess, tempfile, csv def iter\_excel\_libreoffice(file: IO\[bytes\]) -> Iterator\[dict\[str, object\]\]: with tempfile.TemporaryDirectory(prefix=‘excelbenchmark') as tempdir: subprocess.run(\[ ‘libreoffice', ‘–headless', ‘–convert-to', ‘csv', ‘–outdir', tempdir, file.name, \]) with open(f'{tempdir}/{file.name.rsplit(“.”)\[0\]}.csv', ‘r') as f: rows = csv.reader(f) headers = list(map(str, next(rows))) **for** row in rows: yield dict(zip(headers, row))
讓我們來分析一下:
- 創(chuàng)建一個(gè)用于存儲(chǔ) CSV 文件的臨時(shí)目錄:使用內(nèi)置的 tempfile 模塊創(chuàng)建一個(gè)臨時(shí)目錄,完成后會(huì)自動(dòng)清理。理想情況下,我們希望將特定文件轉(zhuǎn)換為內(nèi)存中的類文件對(duì)象,但 libreoffice 命令行不提供轉(zhuǎn)換為特定文件的方法,只能轉(zhuǎn)換為目錄。
- 使用 libreoffice 命令行將文件轉(zhuǎn)換為 CSV:使用內(nèi)置子進(jìn)程模塊執(zhí)行操作系統(tǒng)命令。
- 讀取生成的 CSV:打開新創(chuàng)建的 CSV 文件,使用內(nèi)置的 csv 模塊進(jìn)行解析并生成 dicts。
8.使用 DuckDB 讀取 Excel
如果我們已經(jīng)開始使用外部工具,為什么不給新人一個(gè)競(jìng)爭的機(jī)會(huì)呢?
DuckDB是一個(gè)“進(jìn)程內(nèi)SQL OLAP數(shù)據(jù)庫管理系統(tǒng)”。此描述并沒有立即說明為什么 DuckDB 在這種情況下有用,但確實(shí)如此。DuckDB 非常擅長移動(dòng)數(shù)據(jù)和格式之間的轉(zhuǎn)換。
安裝:
$ pip install duckdb
代碼:
**import** duckdb def iter\_excel\_duckdb(file: IO\[bytes\]) -> Iterator\[dict\[str, object\]\]: duckdb.install\_extension(‘spatial') duckdb.load\_extension(‘spatial') rows = duckdb.sql(f"“” SELECT \* FROM st\_read( ‘{file.name}', open\_options=\[‘HEADERS=FORCE', ‘FIELD\_TYPES=AUTO'\]) “”") **while** row := rows.fetchone(): yield dict(zip(rows.columns, row))
讓我們來分析一下:
- 安裝并加載空間擴(kuò)展:要使用 duckdb 從 Excel 中導(dǎo)入數(shù)據(jù),需要安裝空間擴(kuò)展。這有點(diǎn)奇怪,因?yàn)榭臻g擴(kuò)展用于地理操作,但這正是它想要的。
- 查詢文件:直接使用 duckdb 全局變量執(zhí)行查詢時(shí),默認(rèn)情況下會(huì)使用內(nèi)存數(shù)據(jù)庫,類似于使用 :memory: 選項(xiàng)的 sqlite。要實(shí)際導(dǎo)入 Excel 文件,我們使用 st_read 函數(shù),并將文件路徑作為第一個(gè)參數(shù)。在函數(shù)選項(xiàng)中,我們將第一行設(shè)置為標(biāo)題,并激活自動(dòng)檢測(cè)類型的選項(xiàng)(這也是默認(rèn)選項(xiàng))。
- 構(gòu)建結(jié)果遍歷每一行,并使用每一行的標(biāo)題和值列表構(gòu)建 dict。
9.使用 Calamine 讀取 Excel
近年來,Python 中的每個(gè)性能問題似乎最終都用另一種語言來解決。作為一名 Python 開發(fā)人員,我認(rèn)為這是一個(gè)真正的祝福。這意味著我可以繼續(xù)使用我習(xí)慣的語言并享受所有其他語言的性能優(yōu)勢(shì)!
Calamine是一個(gè)純 Rust 庫,用于讀取 Excel 和 OpenDocument 電子表格文件。要安裝python-calamine爐甘石的 Python 綁定,請(qǐng)執(zhí)行以下命令:
$ pip install python-calamine
代碼:
**import** python\_calamine def iter\_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))) **for** row in rows: yield dict(zip(headers, row))
性能總結(jié)
總結(jié)一下使用Python讀取Excel文件的方法以及讀取Excel花費(fèi)的時(shí)間:
Pandas 32.98
Tablib 28.52
Openpyxl 35.62
Openpyxl (readonly) 24.79
LibreOffice 15.27
DuckDB (sql) 11.36
DuckDB (execute) 5.73
Calamine (python-calamine) 3.58
以上介紹了幾種使用Python讀取Excel文件的方法,每種方法都有其適用場(chǎng)景。對(duì)于數(shù)據(jù)分析師和開發(fā)者來說,選擇合適的庫可以極大地提高工作效率。
那么您應(yīng)該使用哪一個(gè)呢?這取決于…在選擇在 Python 中處理 Excel 文件的庫時(shí),除了速度之外,還有一些其他考慮因素:
- 寫入能力:我們對(duì)讀取 Excel 的方法進(jìn)行了基準(zhǔn)測(cè)試,但有時(shí)也需要生成 Excel 文件。我們進(jìn)行基準(zhǔn)測(cè)試的一些庫不支持寫入。例如 Calamine,不能寫入 Excel 文件,只能讀取。
- 其他格式:系統(tǒng)可能需要加載和生成 Excel 以外的其他格式的文件。一些庫,例如 pandas 和 Tablib 支持多種附加格式,而 calamine 和 openpyxl 僅支持 Excel。
到此這篇關(guān)于Python中讀取Excel最快的幾種常見方法的文章就介紹到這了,更多相關(guān)Python讀取Excel最快方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 使用 Bert 進(jìn)行中文情感分析的方法
在自然語言處理(NLP)領(lǐng)域,情感分析是一個(gè)非常常見且重要的應(yīng)用,本文將帶領(lǐng)新手使用 BERT 模型進(jìn)行中文情感分析,并會(huì)詳細(xì)講解如何加載開源數(shù)據(jù)集、訓(xùn)練模型、評(píng)估準(zhǔn)確度,并最終導(dǎo)出模型供未來使用,感興趣的朋友跟隨小編一起看看吧2024-10-10django多文件上傳,form提交,多對(duì)多外鍵保存的實(shí)例
今天小編就為大家分享一篇django多文件上傳,form提交,多對(duì)多外鍵保存的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08用Python展示動(dòng)態(tài)規(guī)則法用以解決重疊子問題的示例
這篇文章主要介紹了用Python展示動(dòng)態(tài)規(guī)則法用以解決重疊子問題的一個(gè)棋盤游戲的示例,動(dòng)態(tài)規(guī)劃常常適用于有重疊子問題和最優(yōu)子結(jié)構(gòu)性質(zhì)的問題,且耗時(shí)間往往遠(yuǎn)少于樸素解法,需要的朋友可以參考下2015-04-04淺談numpy數(shù)組中冒號(hào)和負(fù)號(hào)的含義
下面小編就為大家分享一篇淺談numpy數(shù)組中冒號(hào)和負(fù)號(hào)的含義,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04在django中實(shí)現(xiàn)頁面倒數(shù)幾秒后自動(dòng)跳轉(zhuǎn)的例子
今天小編就為大家分享一篇在django中實(shí)現(xiàn)頁面倒數(shù)幾秒后自動(dòng)跳轉(zhuǎn)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08python使用 cx_Oracle 模塊進(jìn)行查詢操作示例
這篇文章主要介紹了python使用 cx_Oracle 模塊進(jìn)行查詢操作,結(jié)合實(shí)例形式分析了Python使用cx_Oracle模塊進(jìn)行數(shù)據(jù)庫的基本連接、查詢、輸出等相關(guān)操作技巧,需要的朋友可以參考下2019-11-11