如何使用 Python 讀取數(shù)據(jù)量龐大的 excel 文件

使用 pandas.read_excel 讀取大文件時,的確會遇到性能瓶頸,特別是對于10萬行20列這種規(guī)模的 .xlsx 文件,常規(guī)的 pandas 方法可能會比較慢。

要提高讀取速度,關鍵是找到更高效的方式處理 Excel 文件,特別是在 Python 的生態(tài)圈中,已經(jīng)有多個技術可以幫助解決這個問題。

一種辦法是使用 openpyxl 直接處理 Excel 文件,結合 pandas 來讀取數(shù)據(jù)。這可以讓我們在處理數(shù)據(jù)時獲得更大的靈活性,并通過分塊讀取文件來提高效率。

openpyxl

官網(wǎng)地址:
https://openpyxl.readthedocs.io/en/stable/

另外,還可以選擇 pyxlsb 這個庫,它可以更快速地處理 .xlsb 格式的文件,比傳統(tǒng)的 .xlsx 格式快很多。

pyxlsb

官網(wǎng)地址:https://pypi.org/project/pyxlsb/
如果可能的話,將文件轉為 .csv 格式讀取也會顯著提高性能,因為 CSV 文件是純文本格式,相較于 .xlsx 的結構化存儲,讀取會更加高效。

分析 pandas.read_excel 的性能問題

在實際中,pandas.read_excel 本身的性能瓶頸主要來自于兩個方面:數(shù)據(jù)的解析與文件的格式。.xlsx 是一種基于 XML 的文件格式,因此在讀取時需要解析 XML,這本身就是一個比較慢的過程。尤其當文件較大時,解析 XML 的時間會大幅增加。

為了解決這個問題,可以考慮以下幾種優(yōu)化策略:

  1. 使用不同的引擎pandas 支持多種 Excel 解析引擎,比如 openpyxlxlrd。根據(jù)情況選擇合適的引擎,可能會改善讀取性能。

  2. 分塊讀取:可以通過逐步讀取文件的方式,避免一次性將整個文件加載到內(nèi)存中。這可以顯著減少內(nèi)存占用,并提高讀取的穩(wěn)定性。

  3. 選擇合適的文件格式:如果文件格式不是必須的,可以將 .xlsx 文件轉為 .csv 文件,這樣可以使用更高效的讀取方法。

優(yōu)化方案 1:使用 openpyxlpandas

openpyxlpandas 內(nèi)置支持的引擎之一,但它的讀取速度較慢。在這種情況下,可以手動使用 openpyxl 讀取數(shù)據(jù),然后將其轉換為 pandasDataFrame。

代碼示例

import pandas as pd
from openpyxl import load_workbook

# 讀取xlsx文件的路徑
file_path = "your_large_file.xlsx"

# 使用 openpyxl 直接加載工作簿
wb = load_workbook(filename=file_path, read_only=True)
sheet = wb.active

# 使用生成器按行讀取數(shù)據(jù),避免一次性加載所有數(shù)據(jù)
data = []
for row in sheet.iter_rows(values_only=True):
    data.append(row)

# 轉換為 pandas DataFrame
df = pd.DataFrame(data[1:], columns=data[0])

# 打印讀取的數(shù)據(jù)
print(df.head())

通過這種方法,我們避免了一次性將整個文件加載到內(nèi)存中,而是使用了 openpyxliter_rows 方法逐行讀取文件內(nèi)容。這樣,即使文件非常大,也能有效減輕內(nèi)存負擔。

優(yōu)化方案 2:使用 pyxlsb 讀取 .xlsb 文件

.xlsb 是二進制的 Excel 文件格式,它比 .xlsx 文件格式更為高效,尤其是在處理大文件時,可以顯著減少讀取時間。pyxlsb 庫是一個專門用于讀取 .xlsb 文件的高效庫,配合 pandas 可以更快地讀取數(shù)據(jù)。

代碼示例

import pandas as pd
from pyxlsb import open_workbook

# 將 .xlsx 文件轉換為 .xlsb 格式后使用此方法讀取
file_path = "your_large_file.xlsb"

with open_workbook(file_path) as wb:
    with wb.get_sheet(1) as sheet:
        data = []
        for row in sheet.rows():
            data.append([item.v for item in row])

df = pd.DataFrame(data[1:], columns=data[0])
print(df.head())

使用 pyxlsb 可以有效加快 Excel 文件的讀取速度,特別是在處理非常大的文件時,這個方法比 pandas.read_excel 提供的默認引擎快很多。不過需要注意的是,這種方法僅適用于 .xlsb 格式文件。

優(yōu)化方案 3:使用 dask 分塊處理大數(shù)據(jù)

dask 是一個支持并行計算的 Python 庫,它可以用來處理大型數(shù)據(jù)集。如果我們遇到的數(shù)據(jù)文件過大,dask 提供了類似 pandas 的 API,但它會將大文件分塊處理,避免一次性占用大量內(nèi)存。

代碼示例

import dask.dataframe as dd

# 使用 dask 讀取大文件
file_path = "your_large_file.xlsx"
df = dd.read_excel(file_path)

# 使用 dask 處理數(shù)據(jù)
print(df.head())

dask 是一個非常強大的工具,它不僅支持分布式計算,還可以在多核環(huán)境下加快處理速度。通過將文件拆分成小塊并行處理,dask 能夠高效地應對大規(guī)模數(shù)據(jù)集的讀取和計算。

優(yōu)化方案 4:將文件轉換為 CSV 格式

如果文件的格式不是必須的,那么將 .xlsx 文件轉換為 .csv 格式是一種直接且有效的方式。.csv 格式相較于 .xlsx 沒有復雜的 XML 結構,因此讀取速度會快得多。轉換后可以直接使用 pandas.read_csv 來讀取數(shù)據(jù),速度會比 read_excel 快很多。

代碼示例

import pandas as pd

# 假設已經(jīng)將文件轉換為 CSV 格式
file_path = "your_large_file.csv"

# 使用 pandas 讀取 CSV 文件
df = pd.read_csv(file_path)

# 打印前幾行數(shù)據(jù)
print(df.head())

通過這種方式,能夠顯著提高數(shù)據(jù)讀取速度,因為 .csv 格式的文件是純文本,不需要復雜的解析過程。

其他可能的優(yōu)化策略

除了前面提到的幾種方法,還有一些其他技術可以用來進一步優(yōu)化 Excel 文件的讀取速度:

  1. 并行讀取:如果系統(tǒng)支持,可以將 Excel 文件按工作表或其他分塊標準進行拆分,使用并行處理技術(如 multiprocessing)同時讀取多個小文件。

  2. 數(shù)據(jù)格式優(yōu)化:如果文件的數(shù)據(jù)結構允許,轉換為 Parquet 或 HDF5 格式,這些格式在大數(shù)據(jù)處理方面的性能往往優(yōu)于 Excel 和 CSV。

  3. 增加內(nèi)存或硬件支持:在某些極端情況下,硬件資源不足也可能是瓶頸。增加內(nèi)存或使用更快的硬盤(如 SSD)可以提高整體數(shù)據(jù)讀取的性能。

總結

通過上述幾種方法,可以大幅優(yōu)化使用 Python 讀取大型 Excel 文件的性能。openpyxl 適用于靈活處理 .xlsx 文件,pyxlsb 則是處理 .xlsb 文件的利器,而使用 dask 可以分塊讀取并行處理大數(shù)據(jù)集。此外,如果可以轉換文件格式,使用 .csv 是提升讀取速度的有效途徑。

不同的方案適用于不同的場景,開發(fā)者可以根據(jù)具體需求選擇最合適的解決方案。例如,當文件格式無法改變時,openpyxl 結合 pandas 是一個相對平衡的選擇,而在文件格式靈活的情況下,將 .xlsx 轉為 .csv 并使用 pandas.read_csv 則能最大化提高讀取性能。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容