Python實(shí)現(xiàn)Excel數(shù)據(jù)對比的實(shí)用方案
核心思路與準(zhǔn)備工作
對比Excel數(shù)據(jù)的關(guān)鍵在于選擇合適的比對維度。通常我們會基于唯一標(biāo)識列(如訂單號、產(chǎn)品ID)進(jìn)行關(guān)聯(lián)比對,然后檢查其他字段的差異。
首先安裝必要的庫:
pip install pandas openpyxl
基于Pandas的智能對比方案
以下是一個完整的雙表對比實(shí)現(xiàn):
import pandas as pd
from datetime import datetime
def compare_excel_sheets(file1, file2, key_columns, compare_columns):
"""
智能對比兩個Excel文件
:param file1: 第一個文件路徑
:param file2: 第二個文件路徑
:param key_columns: 關(guān)鍵列列表,用于匹配行
:param compare_columns: 需要對比的列列表
"""
# 讀取Excel文件
df1 = pd.read_excel(file1)
df2 = pd.read_excel(file2)
# 設(shè)置索引以便比較
df1_set = df1.set_index(key_columns)
df2_set = df2.set_index(key_columns)
# 找出所有差異
differences = []
# 檢查新增和刪除的行
common_keys = df1_set.index.intersection(df2_set.index)
only_in_df1 = df1_set.index.difference(df2_set.index)
only_in_df2 = df2_set.index.difference(df1_set.index)
# 記錄增刪情況
for key in only_in_df1:
differences.append({
'類型': '刪除行',
'關(guān)鍵值': key,
'詳情': '存在于第一個文件但第二個文件缺失'
})
for key in only_in_df2:
differences.append({
'類型': '新增行',
'關(guān)鍵值': key,
'詳情': '存在于第二個文件但第一個文件缺失'
})
# 對比共同行的字段差異
for key in common_keys:
row1 = df1_set.loc[key]
row2 = df2_set.loc[key]
for col in compare_columns:
val1 = row1[col]
val2 = row2[col]
# 處理NaN值和正常值的比較
if pd.isna(val1) and pd.isna(val2):
continue
elif pd.isna(val1) or pd.isna(val2) or val1 != val2:
differences.append({
'類型': '數(shù)據(jù)變更',
'關(guān)鍵值': key,
'字段': col,
'文件1值': val1,
'文件2值': val2
})
# 生成對比報告
report_df = pd.DataFrame(differences)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
report_file = f"對比報告_{timestamp}.xlsx"
with pd.ExcelWriter(report_file) as writer:
report_df.to_excel(writer, sheet_name='差異詳情', index=False)
# 添加統(tǒng)計信息
stats = {
'對比時間': [timestamp],
'總差異數(shù)': [len(differences)],
'新增行數(shù)': [len(only_in_df2)],
'刪除行數(shù)': [len(only_in_df1)],
'數(shù)據(jù)變更數(shù)': [len(differences) - len(only_in_df1) - len(only_in_df2)]
}
pd.DataFrame(stats).to_excel(writer, sheet_name='統(tǒng)計摘要', index=False)
return report_file
# 使用示例
if __name__ == "__main__":
result_file = compare_excel_sheets(
file1='銷售數(shù)據(jù)_月初.xlsx',
file2='銷售數(shù)據(jù)_月末.xlsx',
key_columns=['訂單編號'], # 基于訂單號進(jìn)行匹配
compare_columns=['客戶名稱', '產(chǎn)品數(shù)量', '訂單金額', '發(fā)貨狀態(tài)']
)
print(f"對比完成,報告已保存至: {result_file}")
關(guān)鍵優(yōu)勢:這種方法不僅能找出數(shù)據(jù)值的差異,還能識別行的新增和刪除,并提供詳細(xì)的變更記錄。
處理大型文件的優(yōu)化技巧
當(dāng)處理大型Excel文件時,需要考慮內(nèi)存優(yōu)化:
def memory_efficient_compare(file1, file2, key_column):
"""分塊讀取對比,節(jié)省內(nèi)存"""
chunksize = 10000
results = []
for chunk1 in pd.read_excel(file1, chunksize=chunksize):
for chunk2 in pd.read_excel(file2, chunksize=chunksize):
# 實(shí)現(xiàn)分塊對比邏輯
merged = pd.merge(chunk1, chunk2, on=key_column, how='outer', indicator=True)
differences = merged[merged['_merge'] != 'both']
results.append(differences)
return pd.concat(results)
對于需要快速對比兩個excel表中的不同但又不想寫代碼的場景,推薦使用專業(yè)工具如https://www.nimail.cn/dev-tool/excel-compare.html,這類工具通常提供可視化界面和更強(qiáng)大的對比功能。
實(shí)際項目中,建議先將對比邏輯封裝成可重用的函數(shù),然后根據(jù)具體業(yè)務(wù)需求進(jìn)行調(diào)整。比如財務(wù)系統(tǒng)可能需要特別關(guān)注金額字段的精度,而庫存系統(tǒng)可能需要關(guān)注數(shù)量的變化趨勢。
通過Python實(shí)現(xiàn)Excel數(shù)據(jù)對比,不僅能夠自定義對比規(guī)則,還能將對比過程集成到自動化流程中,大幅提升數(shù)據(jù)處理效率。記得在處理重要數(shù)據(jù)前做好備份,并在生產(chǎn)環(huán)境中添加充分的異常處理機(jī)制。
到此這篇關(guān)于Python實(shí)現(xiàn)Excel數(shù)據(jù)對比的實(shí)用方案的文章就介紹到這了,更多相關(guān)Python Excel數(shù)據(jù)對比內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)騰訊滑塊驗(yàn)證碼識別
這篇文章主要介紹了python如何實(shí)現(xiàn)騰訊滑塊驗(yàn)證碼識別,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04
Python使用pyyaml模塊處理yaml數(shù)據(jù)
這篇文章主要介紹了Python使用pyyaml模塊處理yaml數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
Python實(shí)現(xiàn)的簡單讀寫csv文件操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)的簡單讀寫csv文件操作,結(jié)合實(shí)例形式分析了Python使用csv模塊針對csv文件進(jìn)行讀寫操作的相關(guān)實(shí)現(xiàn)技巧與注意事項,需要的朋友可以參考下2018-07-07
如何通過python實(shí)現(xiàn)IOU計算代碼實(shí)例
這篇文章主要介紹了如何通過python實(shí)現(xiàn)IOU計算代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
Python中time.sleep(0.001)是否真的只等待1毫秒
這篇文章主要介紹了Python中time.sleep(0.001)是否真的只等待1毫秒,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
Python游戲開發(fā)實(shí)例之graphics實(shí)現(xiàn)AI五子棋
五子棋是經(jīng)典的棋牌類游戲,很多人都玩過,那么如何用Python實(shí)現(xiàn)五子棋呢,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
Python批量發(fā)送post請求的實(shí)現(xiàn)代碼
昨天學(xué)了一天的Python(我的生產(chǎn)語言是java,也可以寫一些shell腳本,算有一點(diǎn)點(diǎn)基礎(chǔ)),今天有一個應(yīng)用場景,就正好練手了2018-05-05
Python?tkinter庫入門與進(jìn)階之構(gòu)建精美用戶界面
Tkinter是Python的標(biāo)準(zhǔn)GUI(圖形用戶界面)庫,基于Tcl/Tk構(gòu)建,無需額外安裝即可在大多數(shù)Python環(huán)境中使用,這篇文章主要介紹了Python?tkinter庫入門與進(jìn)階之構(gòu)建精美用戶界面的相關(guān)資料,需要的朋友可以參考下2025-12-12

