Python中讀取Excel最快的幾種常見方法
前言
在數(shù)據(jù)分析和處理的日常工作中,Excel文件是一種非常常見的數(shù)據(jù)存儲格式。Python,作為一種功能強大的編程語言,提供了多種庫來幫助用戶輕松讀取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())
這種方法簡單快捷,非常適合進行數(shù)據(jù)分析工作。pandas支持讀取.xls和.xlsx格式的文件,并且可以通過參數(shù)指定特定的工作表和單元格范圍。
2. 使用openpyxl讀取Excel文件
openpyxl是另一個強大的庫,專門用于讀寫.xlsx文件。與pandas不同,openpyxl允許用戶以更細粒度的方式操作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文件
對于較舊版本的.xls文件,xlrd和xlwt庫提供了讀取和寫入的功能。雖然它們不支持.xlsx格式的文件,但對于需要處理遺留數(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)限制了對.xlsx文件的支持,但它仍然是處理.xls文件的有效工具。
4. 使用pyexcel作為一個統(tǒng)一的接口
pyexcel提供了一個簡單的API來讀取、處理和寫入多種不同格式的Excel文件。如果你在尋找一個統(tǒng)一的接口來處理不同類型的Excel文件,pyexcel可能是一個不錯的選擇。
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ā)的,因此其特點是同樣關(guān)注開發(fā)人員體驗和人體工程學(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)測試之前,我們先看看第一行的結(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)您請求字典時,它就是 tablib 返回的內(nèi)容。由于OrderedDict是 的子類dict并且它是在內(nèi)置模塊中定義的,因此我們不介意并認(rèn)為它足以滿足我們的目的。
6.使用 Openpyxl 讀取 Excel
Openpyxl是一個用 Python 讀寫 Excel 文件的庫。與 Tablib 不同,Openpyxl 僅專用于 Excel,不支持任何其他文件類型。
事實上,tablib和pandas在讀取 xlsx 文件時都在底層使用 Openpyxl。也許這種專業(yè)化會帶來更好的表現(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ù)據(jù)流。在本例中,我們對打開的文件進行操作。
- 獲取活動工作表:Excel 文件可以包含多個工作表,我們可以選擇讀取哪個工作表。在本例中,我們只有一張工作表。
- 構(gòu)建頁眉列表:Excel 文件的第一行包含頁眉。要將這些頁眉作為字典的鍵,我們需要讀取第一行并生成頁眉列表。
- 返回結(jié)果:openpyxl 使用的單元格類型包含值和一些元數(shù)據(jù)。這對其他用途很有用,但我們只需要值。要訪問單元格的值,我們使用 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)且顯而易見的方法。我們使用了頂級指定庫并獲得了不錯的結(jié)果?,F(xiàn)在是跳出框框思考的時候了。
LibreOffice是其他辦公套件的免費開源替代品。LibreOffice 可以處理 xls 和 xlsx 文件,并且還恰好包含帶有一些有用的命令行選項的無頭模式:
LibreOffice 命令行選項之一是在不同格式之間轉(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)建一個用于存儲 CSV 文件的臨時目錄:使用內(nèi)置的 tempfile 模塊創(chuàng)建一個臨時目錄,完成后會自動清理。理想情況下,我們希望將特定文件轉(zhuǎn)換為內(nèi)存中的類文件對象,但 libreoffice 命令行不提供轉(zhuǎn)換為特定文件的方法,只能轉(zhuǎn)換為目錄。
- 使用 libreoffice 命令行將文件轉(zhuǎn)換為 CSV:使用內(nèi)置子進程模塊執(zhí)行操作系統(tǒng)命令。
- 讀取生成的 CSV:打開新創(chuàng)建的 CSV 文件,使用內(nèi)置的 csv 模塊進行解析并生成 dicts。
8.使用 DuckDB 讀取 Excel
如果我們已經(jīng)開始使用外部工具,為什么不給新人一個競爭的機會呢?
DuckDB是一個“進程內(nèi)SQL OLAP數(shù)據(jù)庫管理系統(tǒng)”。此描述并沒有立即說明為什么 DuckDB 在這種情況下有用,但確實如此。DuckDB 非常擅長移動數(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))
讓我們來分析一下:
- 安裝并加載空間擴展:要使用 duckdb 從 Excel 中導(dǎo)入數(shù)據(jù),需要安裝空間擴展。這有點奇怪,因為空間擴展用于地理操作,但這正是它想要的。
- 查詢文件:直接使用 duckdb 全局變量執(zhí)行查詢時,默認(rèn)情況下會使用內(nèi)存數(shù)據(jù)庫,類似于使用 :memory: 選項的 sqlite。要實際導(dǎo)入 Excel 文件,我們使用 st_read 函數(shù),并將文件路徑作為第一個參數(shù)。在函數(shù)選項中,我們將第一行設(shè)置為標(biāo)題,并激活自動檢測類型的選項(這也是默認(rèn)選項)。
- 構(gòu)建結(jié)果遍歷每一行,并使用每一行的標(biāo)題和值列表構(gòu)建 dict。
9.使用 Calamine 讀取 Excel
近年來,Python 中的每個性能問題似乎最終都用另一種語言來解決。作為一名 Python 開發(fā)人員,我認(rèn)為這是一個真正的祝福。這意味著我可以繼續(xù)使用我習(xí)慣的語言并享受所有其他語言的性能優(yōu)勢!
Calamine是一個純 Rust 庫,用于讀取 Excel 和 OpenDocument 電子表格文件。要安裝python-calamine爐甘石的 Python 綁定,請執(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花費的時間:
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文件的方法,每種方法都有其適用場景。對于數(shù)據(jù)分析師和開發(fā)者來說,選擇合適的庫可以極大地提高工作效率。
那么您應(yīng)該使用哪一個呢?這取決于…在選擇在 Python 中處理 Excel 文件的庫時,除了速度之外,還有一些其他考慮因素:
- 寫入能力:我們對讀取 Excel 的方法進行了基準(zhǔn)測試,但有時也需要生成 Excel 文件。我們進行基準(zhǔn)測試的一些庫不支持寫入。例如 Calamine,不能寫入 Excel 文件,只能讀取。
- 其他格式:系統(tǒng)可能需要加載和生成 Excel 以外的其他格式的文件。一些庫,例如 pandas 和 Tablib 支持多種附加格式,而 calamine 和 openpyxl 僅支持 Excel。
到此這篇關(guān)于Python中讀取Excel最快的幾種常見方法的文章就介紹到這了,更多相關(guān)Python讀取Excel最快方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Python展示動態(tài)規(guī)則法用以解決重疊子問題的示例
這篇文章主要介紹了用Python展示動態(tài)規(guī)則法用以解決重疊子問題的一個棋盤游戲的示例,動態(tài)規(guī)劃常常適用于有重疊子問題和最優(yōu)子結(jié)構(gòu)性質(zhì)的問題,且耗時間往往遠少于樸素解法,需要的朋友可以參考下2015-04-04在django中實現(xiàn)頁面倒數(shù)幾秒后自動跳轉(zhuǎn)的例子
今天小編就為大家分享一篇在django中實現(xiàn)頁面倒數(shù)幾秒后自動跳轉(zhuǎn)的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08