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í)行基準測試之前,我們先看看第一行的結(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)置模塊中定義的,因此我們不介意并認為它足以滿足我們的目的。
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í)行查詢時,默認情況下會使用內(nèi)存數(shù)據(jù)庫,類似于使用 :memory: 選項的 sqlite。要實際導(dǎo)入 Excel 文件,我們使用 st_read 函數(shù),并將文件路徑作為第一個參數(shù)。在函數(shù)選項中,我們將第一行設(shè)置為標題,并激活自動檢測類型的選項(這也是默認選項)。
- 構(gòu)建結(jié)果遍歷每一行,并使用每一行的標題和值列表構(gòu)建 dict。
9.使用 Calamine 讀取 Excel
近年來,Python 中的每個性能問題似乎最終都用另一種語言來解決。作為一名 Python 開發(fā)人員,我認為這是一個真正的祝福。這意味著我可以繼續(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 的方法進行了基準測試,但有時也需要生成 Excel 文件。我們進行基準測試的一些庫不支持寫入。例如 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基于matplotlib繪制棧式直方圖的方法示例
這篇文章主要介紹了Python基于matplotlib繪制棧式直方圖的方法,涉及Python使用matplotlib進行圖形繪制的相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
python基礎(chǔ)教程之五種數(shù)據(jù)類型詳解
這篇文章主要介紹了python基礎(chǔ)教程之五種數(shù)據(jù)類型詳解的相關(guān)資料,這里對Python 的數(shù)據(jù)類型進行了詳細介紹,需要的朋友可以參考下2017-01-01
淺談Django學(xué)習(xí)migrate和makemigrations的差別
這篇文章主要介紹了淺談Django學(xué)習(xí)migrate和makemigrations的差別,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
詳解Python數(shù)據(jù)結(jié)構(gòu)與算法中的順序表
線性表在計算機中的表示可以采用多種方法,采用不同存儲方法的線性表也有著不同的名稱和特點。線性表有兩種基本的存儲結(jié)構(gòu):順序存儲結(jié)構(gòu)和鏈式存儲結(jié)構(gòu)。本文將介紹順序存儲結(jié)構(gòu)的特點以及各種基本運算的實現(xiàn)。需要的可以參考一下2022-01-01

