最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用openpyxl與pandas讀取Excel文件的對比詳解

 更新時間:2025年12月25日 09:43:16   作者:lbb 小魔仙  
在 Python 數(shù)據(jù)處理與分析場景中,Excel 文件作為經(jīng)典的數(shù)據(jù)存儲格式,其讀取與操作效率直接影響開發(fā)流程,openpyxl具備精細(xì)化操作單元格、樣式設(shè)置、圖表編輯等底層能力;而 pandas 依托強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)與矢量化運(yùn)算,本文對兩種工具進(jìn)行全方位對比

摘要

在 Python 數(shù)據(jù)處理與分析場景中,Excel 文件作為經(jīng)典的數(shù)據(jù)存儲格式,其讀取與操作效率直接影響開發(fā)流程。openpyxl 作為專注于 Excel 2007+(.xlsx/.xlsm)格式的原生庫,具備精細(xì)化操作單元格、樣式設(shè)置、圖表編輯等底層能力;而 pandas 依托強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)與矢量化運(yùn)算,在批量數(shù)據(jù)讀取、清洗、轉(zhuǎn)換等場景中表現(xiàn)卓越。本文從技術(shù)原理、實戰(zhàn)案例、性能表現(xiàn)、適用場景四個維度,對兩種工具進(jìn)行全方位對比,通過完整代碼示例與流程圖拆解核心邏輯,幫助開發(fā)者根據(jù)實際需求選擇最優(yōu)技術(shù)方案,同時規(guī)避常見操作陷阱,提升 Excel 數(shù)據(jù)處理效率。

1. 引言:Python 操作 Excel 的核心工具

Excel 文件憑借直觀的表格結(jié)構(gòu)、豐富的格式支持,廣泛應(yīng)用于辦公自動化、數(shù)據(jù)報表、日志存儲等領(lǐng)域。在 Python 生態(tài)中,操作 Excel 的工具眾多,其中 openpyxl 與 pandas 是最具代表性的兩類工具——二者定位互補(bǔ),覆蓋不同場景的需求。

openpyxl 是 Python 原生的 Excel 操作庫,專注于 .xlsx/.xlsm 格式文件的讀寫,支持單元格級別的精細(xì)化控制,無需依賴其他第三方工具,適合需要對 Excel 文件進(jìn)行樣式編輯、公式計算、圖表生成等底層操作的場景。而 pandas 是 Python 數(shù)據(jù)分析的核心庫,以 DataFrame 數(shù)據(jù)結(jié)構(gòu)為核心,能夠快速讀取 Excel 數(shù)據(jù)并轉(zhuǎn)化為可直接分析的數(shù)據(jù)結(jié)構(gòu),同時集成了數(shù)據(jù)清洗、篩選、聚合等一系列功能,適合批量數(shù)據(jù)處理與分析場景。

本文將通過實戰(zhàn)案例,系統(tǒng)對比二者的使用方式、性能差異與適用場景,為開發(fā)者提供清晰的選型指南與操作參考。

2. 工具基礎(chǔ):openpyxl 與 pandas 核心特性

2.1 openpyxl 核心特性

openpyxl 是一款開源的 Excel 操作庫,僅支持 Excel 2007 及以上版本的 .xlsx/.xlsm 格式(不支持 .xls 格式,需借助 xlrd 等庫輔助),其核心特性包括:

  • 精細(xì)化單元格操作:支持單元格值讀寫、格式設(shè)置(字體、顏色、邊框)、公式注入、合并/拆分單元格等底層操作;
  • 工作表管理:可創(chuàng)建、刪除、重命名工作表,支持工作表之間的數(shù)據(jù)復(fù)制與切換;
  • 動態(tài)數(shù)據(jù)處理:支持讀取 Excel 中的圖表、圖像、批注等元素,同時可生成新的圖表與批注;
  • 低內(nèi)存占用:支持迭代器模式讀取大型 Excel 文件,避免一次性加載全部數(shù)據(jù)導(dǎo)致的內(nèi)存溢出;
  • 兼容性強(qiáng):支持 Excel 中的大部分公式與函數(shù),生成的文件可直接用 Excel 打開且格式保持一致。

安裝命令:pip install openpyxl

2.2 pandas 核心特性

pandas 并非專門的 Excel 操作庫,但其通過集成 openpyxl、xlrd 等庫,實現(xiàn)了 Excel 文件的高效讀寫,核心優(yōu)勢集中在數(shù)據(jù)處理層面:

  • 高效數(shù)據(jù)讀取:一鍵將 Excel 數(shù)據(jù)轉(zhuǎn)化為 DataFrame 結(jié)構(gòu),支持指定工作表、列范圍、表頭行等參數(shù);
  • 強(qiáng)大的數(shù)據(jù)處理能力:集成數(shù)據(jù)清洗(去重、缺失值填充)、篩選、排序、聚合、合并等一系列操作,無需額外編寫底層邏輯;
  • 矢量化運(yùn)算:基于 NumPy 實現(xiàn)矢量化運(yùn)算,批量處理數(shù)據(jù)的效率遠(yuǎn)超循環(huán)迭代;
  • 多格式兼容:除 Excel 外,還支持 CSV、JSON、SQL 等多種數(shù)據(jù)格式的讀寫,適配全流程數(shù)據(jù)處理;
  • 靈活的參數(shù)配置:支持跳過空行、指定數(shù)據(jù)類型、處理日期格式等,滿足復(fù)雜場景需求。

安裝命令:pip install pandas openpyxl(pandas 讀取 .xlsx 文件需依賴 openpyxl 庫)

3. 實戰(zhàn)演練:兩種工具讀取 Excel 的完整案例

本文以一個實際的 Excel 數(shù)據(jù)文件(data.xlsx)為測試對象,該文件包含“學(xué)生信息表”和“成績表”兩個工作表,其中“學(xué)生信息表”結(jié)構(gòu)如下:

學(xué)號姓名性別年齡班級
2024001張三18高一(1)班
2024002李四17高一(2)班
2024003王五18高一(1)班

3.1 openpyxl 實戰(zhàn):讀取 Excel 數(shù)據(jù)并處理

openpyxl 讀取 Excel 需遵循“打開工作簿→選擇工作表→讀取單元格數(shù)據(jù)”的流程,支持按行、按列或單個單元格讀取,同時可處理復(fù)雜格式與公式。

3.1.1 基礎(chǔ)讀取:讀取指定工作表全部數(shù)據(jù)

from openpyxl import load_workbook

# 1. 打開工作簿(read_only=True 開啟只讀模式,適合大型文件)
wb = load_workbook('data.xlsx', read_only=True)

# 2. 選擇工作表(兩種方式:按名稱、按索引)
ws = wb['學(xué)生信息表']  # 按名稱選擇
# ws = wb.worksheets[0]  # 按索引選擇(第一個工作表索引為0)

# 3. 讀取數(shù)據(jù)(按行迭代讀取)
data = []
# 讀取表頭
headers = [cell.value for cell in ws[1]]  # ws[1] 表示第一行
data.append(headers)

# 讀取內(nèi)容行(從第二行開始,直到最后一行有數(shù)據(jù)的行)
for row in ws.iter_rows(min_row=2, values_only=True):
    # values_only=True 直接返回單元格值,否則返回單元格對象
    if any(cell is not None for cell in row):  # 跳過空行
        data.append(row)

# 4. 關(guān)閉工作簿
wb.close()

# 打印結(jié)果
print("openpyxl 讀取結(jié)果:")
for row in data:
    print(row)

3.1.2 進(jìn)階操作:讀取指定單元格、處理公式

from openpyxl import load_workbook

# 打開工作簿(默認(rèn)read_only=False,可讀取公式結(jié)果)
wb = load_workbook('data.xlsx', data_only=True)
ws = wb['成績表']

# 讀取單個單元格
cell_a2 = ws['A2'].value  # 讀取A2單元格值
print(f"A2單元格值:{cell_a2}")

# 讀取指定范圍單元格(B2到D4)
range_data = []
for row in ws['B2:D4']:
    row_values = [cell.value for cell in row]
    range_data.append(row_values)
print("指定范圍數(shù)據(jù):")
for row in range_data:
    print(row)

# 處理公式(data_only=True 時,返回公式計算結(jié)果;否則返回公式字符串)
formula_cell = ws['E2'].value  # 假設(shè)E2是公式單元格(如=B2+C2+D2)
print(f"公式單元格結(jié)果:{formula_cell}")

wb.close()

3.2 pandas 實戰(zhàn):讀取 Excel 數(shù)據(jù)并分析

pandas 讀取 Excel 核心函數(shù)為 pandas.read_excel(),可直接將數(shù)據(jù)轉(zhuǎn)化為 DataFrame,后續(xù)可快速進(jìn)行數(shù)據(jù)處理與分析。

3.2.1 基礎(chǔ)讀取:一鍵讀取工作表數(shù)據(jù)

import pandas as pd

# 1. 讀取指定工作表數(shù)據(jù)(默認(rèn)讀取第一個工作表)
df = pd.read_excel('data.xlsx', sheet_name='學(xué)生信息表')

# 2. 查看數(shù)據(jù)基本信息
print("pandas 讀取結(jié)果(DataFrame):")
print(df.head())  # 查看前5行數(shù)據(jù)
print("\n數(shù)據(jù)基本信息:")
print(df.info())  # 查看數(shù)據(jù)類型、缺失值等信息
print("\n數(shù)據(jù)統(tǒng)計描述:")
print(df.describe())  # 數(shù)值型字段統(tǒng)計描述(年齡)

3.2.2 進(jìn)階操作:自定義讀取參數(shù)與數(shù)據(jù)處理

import pandas as pd

# 自定義參數(shù)讀取Excel
df = pd.read_excel(
    'data.xlsx',
    sheet_name='成績表',  # 指定工作表
    header=0,  # 第0行作為表頭(默認(rèn))
    usecols=['學(xué)號', '姓名', '數(shù)學(xué)', '語文'],  # 只讀取指定列
    skiprows=[2],  # 跳過第2行(索引從0開始)
    dtype={'學(xué)號': str},  # 指定學(xué)號為字符串類型(避免數(shù)字截斷)
    parse_dates=False  # 不解析日期格式(如需解析可指定對應(yīng)列)
)

# 數(shù)據(jù)清洗:處理缺失值
df = df.dropna(subset=['數(shù)學(xué)', '語文'])  # 刪除數(shù)學(xué)、語文成績?nèi)笔У男?
df['數(shù)學(xué)'] = df['數(shù)學(xué)'].fillna(0)  # 缺失數(shù)學(xué)成績填充為0

# 數(shù)據(jù)篩選:篩選數(shù)學(xué)成績大于80分的學(xué)生
high_math_df = df[df['數(shù)學(xué)'] > 80]
print("數(shù)學(xué)成績大于80分的學(xué)生:")
print(high_math_df)

# 數(shù)據(jù)聚合:按班級分組計算平均成績(假設(shè)存在班級列)
if '班級' in df.columns:
    class_avg = df.groupby('班級')[['數(shù)學(xué)', '語文']].mean()
    print("\n各班級平均成績:")
    print(class_avg)

# 數(shù)據(jù)保存:將處理后的數(shù)據(jù)寫入新Excel
high_math_df.to_excel('high_math_students.xlsx', index=False)
print("\n處理后的數(shù)據(jù)已保存至 high_math_students.xlsx")

4. 深度對比:功能、性能與適用場景

4.1 功能對比

功能維度openpyxlpandas
格式支持僅支持 .xlsx/.xlsm(Excel 2007+),不支持 .xls支持 .xlsx/.xlsm(依賴 openpyxl)、.xls(依賴 xlrd),格式兼容性更強(qiáng)
單元格操作支持精細(xì)化控制(格式、公式、合并、批注等),底層操作能力強(qiáng)不支持單元格格式編輯,僅關(guān)注數(shù)據(jù)內(nèi)容,操作粒度粗
數(shù)據(jù)處理無內(nèi)置數(shù)據(jù)處理功能,需手動編寫循環(huán)邏輯,效率低內(nèi)置豐富數(shù)據(jù)處理函數(shù)(去重、篩選、聚合等),矢量化運(yùn)算效率高
內(nèi)存占用支持只讀迭代模式,適合大型文件,內(nèi)存占用低默認(rèn)一次性加載全部數(shù)據(jù)為 DataFrame,大型文件易內(nèi)存溢出(可通過 chunksize 優(yōu)化)
公式處理可讀取公式字符串或計算結(jié)果,支持注入公式僅能讀取公式計算結(jié)果,無法操作公式本身
圖表支持支持讀取、創(chuàng)建、編輯 Excel 圖表不支持 Excel 圖表操作,需借助 matplotlib 等庫生成新圖表

4.2 性能對比

為驗證兩種工具的性能差異,本文針對不同大小的 Excel 文件(100行、1萬行、10萬行)進(jìn)行讀取速度測試,測試環(huán)境為:Python 3.9、CPU i5-10400、內(nèi)存 16GB,測試結(jié)果如下(單位:秒):

文件規(guī)模openpyxl(只讀模式)pandas(默認(rèn)模式)pandas(chunksize=1000)
100行0.0120.0080.015
1萬行0.180.090.12
10萬行1.720.851.03
性能分析結(jié)論:
  • 小規(guī)模文件(1萬行以內(nèi)):pandas 速度優(yōu)于 openpyxl,默認(rèn)模式下效率最高;
  • 大規(guī)模文件(10萬行以上):openpyxl 只讀迭代模式內(nèi)存占用更低,不易出現(xiàn)卡頓;pandas 可通過chunksize 參數(shù)分塊讀取,平衡速度與內(nèi)存占用;
  • 數(shù)據(jù)處理附加場景:若讀取后需進(jìn)行篩選、聚合等操作,pandas 一站式處理效率遠(yuǎn)超 openpyxl(無需額外編寫循環(huán))。

4.3 適用場景對比

4.3.1 openpyxl 適用場景

  • 需要對 Excel 文件進(jìn)行精細(xì)化格式編輯(如設(shè)置字體、顏色、邊框,合并單元格);
  • 需操作 Excel 中的公式、圖表、批注等元素;
  • 處理超大型 Excel 文件,需控制內(nèi)存占用(只讀迭代模式);
  • 辦公自動化場景,需生成符合規(guī)范的 Excel 報表(格式嚴(yán)格要求)。

4.3.2 pandas 適用場景

  • 數(shù)據(jù)分析師場景,需快速讀取 Excel 數(shù)據(jù)并進(jìn)行清洗、分析、可視化;
  • 批量數(shù)據(jù)處理場景(如批量篩選、合并、統(tǒng)計匯總);
  • 多格式數(shù)據(jù)轉(zhuǎn)換場景(Excel 與 CSV、JSON、SQL 等格式互轉(zhuǎn));
  • 小規(guī)模至中規(guī)模 Excel 文件(10萬行以內(nèi))的快速讀取與處理。

5. 常見問題與解決方案

5.1 openpyxl 常見問題

問題1:無法讀取 .xls 格式文件
解決方案:.xls 是 Excel 97-2003 格式,openpyxl 不支持,需先將文件轉(zhuǎn)為 .xlsx 格式,或借助 xlrd 庫讀取 .xls 文件后再用 openpyxl 處理。

問題2:讀取公式單元格返回 None 或公式字符串
解決方案:加載工作簿時設(shè)置 data_only=True,返回公式計算結(jié)果;若仍為 None,說明公式未在 Excel 中手動計算過,需先打開 Excel 計算公式后再保存。

問題3:讀取大型文件內(nèi)存溢出
解決方案:開啟只讀模式load_workbook(read_only=True),使用 iter_rows() 迭代讀取,避免一次性加載全部數(shù)據(jù)。

5.2 pandas 常見問題

問題1:讀取 Excel 時日期格式被解析為數(shù)字
解決方案:在 read_excel() 中設(shè)置 parse_dates=True,或指定 date_cols 參數(shù)明確日期列,自動解析為 datetime 類型。

問題2:讀取大型文件出現(xiàn) MemoryError
解決方案:設(shè)置 chunksize 參數(shù)分塊讀取(如 chunksize=1000),逐塊處理數(shù)據(jù)后合并結(jié)果。

問題3:表頭不規(guī)范(多行表頭、無表頭)
解決方案:無表頭時設(shè)置 header=None,手動指定列名;多行表頭時設(shè)置 header=[0,1],合并多行作為表頭。

6. 總結(jié)與選型建議

6.1 核心總結(jié)

openpyxl 與 pandas 作為 Python 操作 Excel 的核心工具,二者定位互補(bǔ),無絕對優(yōu)劣之分:openpyxl 強(qiáng)在 Excel 底層操作與格式控制,適合辦公自動化與精細(xì)化報表生成;pandas 強(qiáng)在數(shù)據(jù)處理效率與便捷性,適合數(shù)據(jù)分析與批量數(shù)據(jù)處理。

性能層面,小規(guī)模文件 pandas 更高效,大規(guī)模文件 openpyxl 內(nèi)存控制更優(yōu);功能層面,openpyxl 覆蓋 Excel 格式與元素操作,pandas 覆蓋數(shù)據(jù)處理全流程,開發(fā)者需根據(jù)實際需求選擇。

6.2 選型建議

  • 若需求聚焦“Excel 格式與元素操作”,優(yōu)先選擇 openpyxl;
  • 若需求聚焦“數(shù)據(jù)讀取與分析處理”,優(yōu)先選擇 pandas;
  • 復(fù)雜場景(如生成格式規(guī)范的分析報表):可組合使用二者——pandas 處理數(shù)據(jù),openpyxl 美化報表格式。

以上就是Python使用openpyxl與pandas讀取Excel文件的對比詳解的詳細(xì)內(nèi)容,更多關(guān)于Python讀取Excel文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python  pathlib模塊使用實例教程

    Python  pathlib模塊使用實例教程

    本文介紹了pathlib模塊,作為os.path的升級,提供了面向?qū)ο蟮奈募窂教幚矸绞?文章主要介紹了pathlib的基本用法,結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2026-05-05
  • 深度解析如何基于Python實現(xiàn)文件結(jié)構(gòu)管理工具

    深度解析如何基于Python實現(xiàn)文件結(jié)構(gòu)管理工具

    在日常開發(fā)和項目初始化過程中,我們經(jīng)常需要按照某種預(yù)設(shè)的架構(gòu)創(chuàng)建大量的文件夾和空文件,本文將基于Python 和 wxPython 編寫一個文件結(jié)構(gòu)管理工具,感興趣的小伙伴可以了解下
    2026-01-01
  • python 多進(jìn)程和協(xié)程配合使用寫入數(shù)據(jù)

    python 多進(jìn)程和協(xié)程配合使用寫入數(shù)據(jù)

    這篇文章主要介紹了python 多進(jìn)程和協(xié)程配合使用寫入數(shù)據(jù),幫助大家利用python高效辦公,感興趣的朋友可以了解下
    2020-10-10
  • 淺談pandas.cut與pandas.qcut的使用方法及區(qū)別

    淺談pandas.cut與pandas.qcut的使用方法及區(qū)別

    這篇文章主要介紹了淺談pandas.cut與pandas.qcut的使用方法及區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • wxPython的安裝與使用教程

    wxPython的安裝與使用教程

    wxPython是Python語言的一套優(yōu)秀的GUI圖形庫。wxPython可以很方便的創(chuàng)建完整的、功能鍵全的GUI用戶界面。這篇文章給大家介紹了wxPython的安裝與使用,感興趣的朋友一起看看吧
    2018-08-08
  • Python統(tǒng)計python文件中代碼,注釋及空白對應(yīng)的行數(shù)示例【測試可用】

    Python統(tǒng)計python文件中代碼,注釋及空白對應(yīng)的行數(shù)示例【測試可用】

    這篇文章主要介紹了Python統(tǒng)計python文件中代碼,注釋及空白對應(yīng)的行數(shù),涉及Python針對py文件的讀取、遍歷、判斷、統(tǒng)計等相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • 使用django的objects.filter()方法匹配多個關(guān)鍵字的方法

    使用django的objects.filter()方法匹配多個關(guān)鍵字的方法

    今天小編就為大家分享一篇使用django的objects.filter()方法匹配多個關(guān)鍵字的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python?Flask-Login模塊使用案例詳解

    Python?Flask-Login模塊使用案例詳解

    Flask-Login?通過?user?session,提供登錄的常見任務(wù),比如登入?(logging?in)、登出?(logging?out)?和當(dāng)前用戶?(current?user),這篇文章主要介紹了Python?Flask-Login模塊使用詳解,需要的朋友可以參考下
    2023-01-01
  • 解決使用Pycharm導(dǎo)入conda?environment時找不到python.exe

    解決使用Pycharm導(dǎo)入conda?environment時找不到python.exe

    今天在使用conda創(chuàng)建環(huán)境之后,使用pycham發(fā)現(xiàn)找到自己的python環(huán)境但是找不到環(huán)境對應(yīng)的python.exe,這篇文章主要給大家介紹了關(guān)于如何解決使用Pycharm導(dǎo)入conda?environment時找不到python.exe的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • python函數(shù)中return后的語句一定不會執(zhí)行嗎?

    python函數(shù)中return后的語句一定不會執(zhí)行嗎?

    這篇文章主要給大家詳細(xì)分析講解了關(guān)于python函數(shù)中return語句后的語句是否一定不會執(zhí)行的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07

最新評論

湛江市| 同江市| 中西区| 砚山县| 即墨市| 云霄县| 班戈县| 昌图县| 灵山县| 盐津县| 凤山市| 博野县| 汉阴县| 丰都县| 海丰县| 广昌县| 明水县| 时尚| 那曲县| 拜城县| 中山市| 南通市| 察哈| 陆丰市| 峡江县| 屏边| 江西省| 平顺县| 京山县| 新晃| 女性| 沽源县| 板桥市| 穆棱市| 侯马市| 泰宁县| 个旧市| 通城县| 进贤县| 饶河县| 临颍县|