Python比对指定目录下的Excel数据(附源码)
需求分析
近期需要一個腳本將錄入員錄入的兩個Excel文件進行比對,檢查二者錄入的內容是否相同,將有錯的內容以log日志的方式輸出到.txt文件中,輸出的內容是“文件1的路徑”+“文件2的路徑”+“哪個sheet表”+“第幾列出問題”。這樣方便人員進行確認并重新找出進行檢查。
根據這樣的需求,首先確定了所使用的工具和程序編寫架構:
讀取Excel表的數據:使用Python中的Panda庫,其中的函數可以很方便的讀取出所需要的數據。
程序框架
1.首先實現指定兩個文件名的Excel表的指定列的數據讀出并比對,按照需求設計輸出log日志;
2.其次實現指定兩個文件名的Excel表的不同Sheet表中指定列的數據讀出并比對,按照要求輸出log日志;
3.到這步就已經完成對兩個文件的所有數據的比對了,接著把程序封裝成函數,編寫批處理程序;
4.給定對比的兩個文件夾目錄,挑出所有.xlsx文件放到列表中,用for循環一個一個打開再調用上一個函數進行比對,輸出結果。
5.將其打包封裝為.exe可執行文件,這樣可以方便團隊其他的小伙伴再沒裝Python或者panda包的情況下也可以利用這個腳本進行對比。
代碼實現
- 對比兩個Excel表的異同:
代碼如下:
# 對比一個sheet的值是否正確 def compareSheet(file1, file2, wavelist1):'''該函數對比同一個sheet表中的數據是否正確:param file1::param file2::param sheetName::return:'''sheet = pd.read_excel(wavelist1[0], sheet_name=None) # 打開一次獲取sheetsheet_names = list(sheet.keys()) # 獲取sheet名稱flag = len(sheet_names) # 計算長度# print("sheet_names:",sheet_names)k = 0 # 控制sheet移動if k < flag:sheetName = sheet_names[k]data1 = pd.read_excel(file1, sheet_name=sheetName, usecols=[1])data1 = data1.values# print("打開",file1,"成功")data2 = pd.read_excel(file2, sheet_name=sheetName, usecols=[1])data2 = data2.valuesk = k + 1# print("打開", file2, "成功")# print("表1的值",data1)# print("表2的值",data2)len1 = len(data1)len2 = len(data2)if len1 == len2:for i in range(len1):test1 = data1[i]test2 = data2[i]# print('data1', test1)# print('data2', test2)if test1 != test2:print(file1, '和', file2, '中', sheetName, '中,第', i + 2, '列出錯', test1, '!=', test2,file=file_handle)從指定路徑中找出所有xlsx文件:
#寫入路徑 filepath = "F:\\questionnaire\\datasheet1" # 輸入文件所在的路徑 comparefilepath = "F:\\questionnaire\\datasheet2" # 對比文件的路徑 logfilepath = "F:\\questionnaire\\log.txt" # 結果輸出路徑 file_handle = open(logfilepath, mode='w') # 結果輸出的路徑 # file1 = 'F:\\questionnaire\\datasheet1\\271.xlsx' # file2 = 'F:\\questionnaire\\datasheet2\\271.xlsx' filenames1 = os.listdir(filepath) filenames2 = os.listdir(comparefilepath) wavelist1 = [] wavelist2 = [] # 讀取路徑1中所有xlsx數據 for filename in filenames1:name, category = os.path.splitext(filepath + filename) # 分解文件擴展名if category == '.xlsx': # 若文件為xlx音頻文件wavelist1.append(filepath + '\\' + filename) # 獲得文件路徑 此數據要寫入compare的filename中names1, cat = os.path.splitext(filename) # 獲得文件名 此names數據在出錯處當指引使用# test = pd.read_excel(wavelist)# test = test.values# print(filename, '的數據為:',test) # print(wavelist1) # 讀取路徑2中所有xlsx數據 for filename in filenames2:name, category = os.path.splitext(comparefilepath + filename) # 分解文件擴展名if category == '.xlsx': # 若文件為xlx音頻文件wavelist2.append(comparefilepath + '\\' + filename) # 獲得文件路徑 此數據要寫入compare的filename中names2, cat = os.path.splitext(filename) # 獲得文件名 此names數據在出錯處當指引使用# test = pd.read_excel(wavelist)# test = test.values# print(filename, '的數據為:',test) # print(wavelist2)將找出的文件按照順序進行比對:
filenum1 = len(wavelist1) filenum2 = len(wavelist2) if filenum1 == filenum2:for j in range(filenum1):# print('wavelist1:', wavelist1[j])# print('wavelist2:', wavelist2[j])compareSheet(wavelist1[j], wavelist2[j], wavelist1)file_handle.close() print("結果已經輸出至:",logfilepath)驗證結果
我們使用Excel軟件自帶的Database Compare進行文件比對,驗證所寫腳本是否正確,有沒有錯判或者漏判的情況。
在輸出日志中找到182.xlsx表進行對比,Python腳本的檢查結果如下所示,Database Compare的檢查結果如下所示。
從結果中可以看出,對單個文件檢測結果是正確的,另外再對比其他文件試試。
源碼
import pandas as pd import os # 對比一個sheet的值是否正確 def compareSheet(file1, file2, wavelist1):'''該函數對比同一個sheet表中的數據是否正確:param file1: 文件1的路徑:param file2: 文件2的路徑:param sheetName::return:'''sheet = pd.read_excel(wavelist1[0], sheet_name=None) # 打開一次獲取sheetsheet_names = list(sheet.keys()) # 獲取sheet名稱flag = len(sheet_names) # 計算長度for k in sheet_names:data1 = pd.read_excel(file1, sheet_name=k, usecols=[1], keep_default_na=False)data1 = data1.valuesdata2 = pd.read_excel(file2, sheet_name=k, usecols=[1], keep_default_na=False)data2 = data2.valueslen1 = len(data1)len2 = len(data2)if len1 == len2:for i in range(len1):test1 = data1[i]test2 = data2[i]# print('data1', test1)# print('data2', test2)if test1 != test2:# print(file1, '和', file2, '中', k, '中,第', i + 2, '列出錯', test1, '!=', test2)print(file1, '和', file2, '中', k, '中,第', i + 2, '列出錯', test1, '!=', test2, file=file_handle)#寫入路徑 # filepath = "F:\\questionnaire\\datasheet1" # 輸入文件所在的路徑 # comparefilepath = "F:\\questionnaire\\datasheet2" # 對比文件的路徑 # logfilepath = "F:\\questionnaire\\log.txt" # 結果輸出路徑 filepath = input("輸入原文件夾所在路徑:\n") comparefilepath = input("輸入需要對比的文件夾所在路徑:\n") logfilepath = "log.txt" file_handle = open(logfilepath, mode='w') # 結果輸出的路徑 # file1 = 'F:\\questionnaire\\datasheet1\\271.xlsx' # file2 = 'F:\\questionnaire\\datasheet2\\271.xlsx' filenames1 = os.listdir(filepath) filenames2 = os.listdir(comparefilepath) wavelist1 = [] wavelist2 = [] # 讀取路徑1中所有xlsx數據 for filename in filenames1:name, category = os.path.splitext(filepath + filename) # 分解文件擴展名if category == '.xlsx': # 若文件為xlx音頻文件wavelist1.append(filepath + '\\' + filename) # 獲得文件路徑 此數據要寫入compare的filename中names1, cat = os.path.splitext(filename) # 獲得文件名 此names數據在出錯處當指引使用# test = pd.read_excel(wavelist)# test = test.values# print(filename, '的數據為:',test) # print(wavelist1) # 讀取路徑2中所有xlsx數據 for filename in filenames2:name, category = os.path.splitext(comparefilepath + filename) # 分解文件擴展名if category == '.xlsx': # 若文件為xlx音頻文件wavelist2.append(comparefilepath + '\\' + filename) # 獲得文件路徑 此數據要寫入compare的filename中names2, cat = os.path.splitext(filename) # 獲得文件名 此names數據在出錯處當指引使用# test = pd.read_excel(wavelist)# test = test.values# print(filename, '的數據為:',test) # print(wavelist2) wavelist1.sort(reverse=True) wavelist2.sort(reverse=True) filenum1 = len(wavelist1) filenum2 = len(wavelist2) if filenum1 == filenum2:for j in range(filenum1):# print('wavelist1:', wavelist1[j])# print('wavelist2:', wavelist2[j])compareSheet(wavelist1[j], wavelist2[j], wavelist1)file_handle.close() print("結果已經輸出至:",logfilepath)總結
以上是生活随笔為你收集整理的Python比对指定目录下的Excel数据(附源码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: csdn如何插入多列表格?
- 下一篇: 将py文件打包为exe可执行文件