最近有小伙伴說需要一個工具,用來對比2個excel表的差異,直接標記出來有差異的行,
代碼倒還挺簡單的,為了方便小白使用,我給它打包成exe檔案,點擊執行即可輸出結果,
1、先說一下怎么用,后面上代碼
鏈接:https://pan.baidu.com/s/1oNEeIDOnw1Grw2MOdJrwUQ
提取碼:w29l
先到網盤鏈接,下載檔案:
如果不需要源代碼,直接下載xlsx_compare.rar即可,

解壓后打開:
這里面2個xlsx檔案是我用來測驗的檔案,可以直接換成你自己的,必須是2個,不要放其他檔案,
劃重點:你的2個excel檔案必須是xlsx格式的檔案,且對比的內容放在Sheet1,

點擊exe檔案,結果如下:

會輸出3份檔案,第一個error_info.txt,就是執行程序中有報錯的資訊會寫入到這檔案里,運行正常的話里面寫的是,

如果出現例外,例如你的2個對比檔案忘記放進去了,error_info.txt就是這樣的

另外2個new結尾的檔案,就是對比的結果了,打開看看,

D列的資料因為長度超長,把它拉開就能看到內容了,
對比發現不一致的話,會在最后一列Compare Result標記

像這樣的話,說明2個檔案的第5、6、7行不一致,第8行是因為test1.xlsx沒有第8行資料,而test2.xlsx有,因此也標記出來,
這樣我們通過excel的篩選器過濾一下,就能得到2個檔案不一致的所有行了

2、代碼
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# date: 2021/4/17
# filename: xlsx_compare
# author: kplin
import pandas as pd
import os
def my_log(info):
try:
with open('error_info.txt', 'w+') as f:
f.write(info)
f.close()
except Exception as e:
print('寫入錯誤日志時發生以下錯誤:\n%s'%e)
def get_file():
try:
# 獲取當前檔案夾下的2個檔案
dir_path = os.getcwd()
files = os.listdir(dir_path)
ret = []
for i in files:
if i.endswith('.xlsx') and not i.endswith('_new.xlsx'):
ret.append(i)
if i.endswith('.xlsx') and not i.endswith('_new.xlsx') and '~$' in i:
info ='請關閉檔案%s'%i
my_log(info)
return None
if len(ret) == 0:
info = '找不到待檢測檔案,請將2個xlsx檔案放入此檔案夾'
my_log(info)
return None
# print(ret)
return ret[0], ret[1]
except Exception as e:
my_log(str(e))
def main(file1, file2):
try:
# 1、獲取原檔案路徑和名稱,先準備即將生成的新檔案名和檔案路徑
fname1, ext = os.path.splitext(os.path.basename(file1))
new_file1 = file1.replace(fname1, fname1 + '_new')
fname2, ext = os.path.splitext(os.path.basename(file2))
new_file2 = file2.replace(fname2, fname2 + '_new')
# 2、讀取檔案
df1 = pd.read_excel(file1)
df2 = pd.read_excel(file2)
length = len(df1) if len(df1) >= len(df2) else len(df2)
# 兩個資料塊行數不一致,補成一致的
if len(df1) - len(df2) > 0:
# 獲取DF1的列名
d = {}
for i in df2.columns:
d[i] = ['' for x in range(len(df1) - len(df2))]
concat_df = pd.DataFrame(d)
df2 = pd.concat([df2, concat_df])
if len(df2) - len(df1) > 0:
d = {}
for i in df1.columns:
d[i] = ['' for x in range(len(df2) - len(df1))]
concat_df = pd.DataFrame(d)
df1 = pd.concat([df1, concat_df])
dis_index = []
for i in range(len(df1)):
ret = df1.iloc[i, :]==df2.iloc[i, :]
if False in ret.tolist():
dis_index.append(i)
dis_list = ['' for i in range(length)]
for i in dis_index:
dis_list[i] = '不一致'
df1['Compare Result'] = dis_list
df2['Compare Result'] = dis_list
df1.to_excel(new_file1, index=False)
df2.to_excel(new_file2, index=False)
my_log('校驗成功,本次對比檔案為:%s%s 和 %s%s'%(fname1, ext, fname2, ext))
print('校驗完成,請查看新檔案')
except Exception as e:
print('出現未知錯誤,請查看error_info.txt')
my_log(str(e))
if __name__ == '__main__':
if not get_file():
print('讀取檔案時發生錯誤,請查看error_info.txt')
else:
file1, file2 = get_file()
main(file1, file2)
總共有3個函式:
1、my_log函式用來寫入日志,
2、get_file函式用來獲取當前路徑下所有后綴名為.xlsx的檔案,會排除掉_new.xlsx檔案,并且如果當前檔案夾下有打開的excel檔案,會自動結束運行,提示關閉當前檔案夾下已被打開的excel檔案,
3、main函式用來處理比對,并輸出結果:
這里主要使用pandas讀取資料并逐行對比,如果不一致,會記錄下差異的位置,當檢查完所有行后,給資料塊加上一列Compare Result,把差異的行做一個標記,最后寫入生成2個新檔案,
依賴包都在requirements.txt里:
pandas 1.1.4
openpyxl 3.0.7
xlrd 1.2.0
可以直接pip install -r requirements.txt,直接下載安裝依賴包,
邏輯很簡單,但沒有經過充分測驗,可能遇到某些特殊情況會有其他報錯,如果有的話,給我留言說明是什么情況導致的報錯,有時間就改進一下,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/278478.html
標籤:python
下一篇:Python實作郵箱發送功能
