Python開發excel文件對比腳本,結果寫入log文件

背景:前面完善了swagger直接生成excel測試用例之後,在開發階段,接口變更評率較高,如每次開發更新接口文檔之後,都需要重新生成用例,如此不知道如何來對比兩份excel測試用例哪裏做了改動,故而需要做兩個excel的文件對比,秉着向優秀程序員學習的態度,百年老梗:百度啊!

 完了,發現百度也真是個巨坑,每次搜索的代碼,都要費老大勁的完善,不過不管怎麼說,還是要感謝別人的辛勤付出!真心喜歡上了重構,改造別人的代碼就是有成就感!

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @desc    : 對比接口excel

import xlrd
import time
import config
from utils.HandleLogging import log

#往日誌文件中追加內容函數#個人感覺這個很雞肋,實際以日誌輸出就可以
def write_file(filename,content):
    '''
           寫入文件,將對比不同的測試用例寫入日誌
    '''
    with open(filename,'a',encoding='utf-8') as file: #以追加方式打開日誌文件
        time_now= time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())  #系統時間格式化
        file.write(time_now+':'+content+'\n')      #寫入內容

def read_excel(ori_path,tar_path,sub_name):#
    '''讀取excel表格'''
    success=0        #匹配一致數量
    fail=0           #匹配不一致數量
    origin_xls={} #存儲源xls文件
    target_xls={} #比對的xls文件
    wb_ori=xlrd.open_workbook(ori_path) #打開原始文件
    wb_tar=xlrd.open_workbook(tar_path) #打開目標文件

    startime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())    #獲取系統當前時間並格式化爲格式
    log.info('【{},開始對比,{}】...'.format(ori_path.split("\\")[-1],tar_path.split("\\")[-1]))
#     log.info(startime,"開始比對//。。。") #請用格式化輸出
    #將對比結果重新寫入一個日誌文件
    logname='log_'+startime[0:10]+'.log' #截取日期年月日構成日誌文件名

#創建日誌文件,如果文件存在則清空內容,不存在則創建,如果需要同時批量比對多張表,可以考慮將日誌文件名作爲參數傳入
    with open(logname,'w',encoding='utf-8') as logfile:    
        logfile.writelines(startime+':【開始比對】...'+'\n')
        
    try:
#         比較excel的表名
        sheet_ori=wb_ori.sheet_by_name(sub_name)
        sheet_tar=wb_tar.sheet_by_name(sub_name)
        if sheet_ori.name==sheet_tar.name:
            #sheet表名
            if sheet_ori.name==sub_name:
            #先將數存入dictionary中dictionary(rows:list)
            #第一行存儲表頭
            #源表取一行數據與目標表全表進行比對如果表中存在主鍵可以用主鍵進行索引
            #數據從excel第3行開始
                for rows in range(0,sheet_ori.nrows):
                    orign_list=sheet_ori.row_values(rows) #源表i行數據
                    origin_xls[rows]=orign_list     #源表寫入字典
                for rows in range(0, sheet_tar.nrows):
                    target_list = sheet_tar.row_values(rows)  # 目標表i行數據
                    target_xls[rows] = target_list  # 目標表寫入字典
#                     第一行表頭比較
                if origin_xls[0]  == target_xls[0]:
                    log.info('表頭一致')
                    
                orinum = len(origin_xls)
                log.info("源文件數量:{}".format(orinum)) 
                tarnum = len(target_xls)
                log.info("目標文件數量:{}".format(tarnum))
                
                mult_num=tarnum if tarnum<=orinum else orinum
#                 if num >= num1: #判斷兩個xlsx對象數據大於0即可
                if mult_num>0:
#                     文件行數的大小比較,誰行數少就返回來,因爲多出來的數據無法對比
#                     如果目標行數小於源文件行數,則遍歷最大行數的數據
                    xlsxfile=origin_xls if tarnum<orinum else target_xls
#                     爲了不管傳入對比xlsx文件的位置,都以最少的行數對比次數
                    for ori_num in xlsxfile:
                        log.info("開始對比第:{}條".format(ori_num+1))
                        flag='false'   #判斷是否一致標誌
#                         for tar_num in target_xls:#in的對象,寫一個條件判斷,哪個文件少就返回哪個
#                         xlsxfile=origin_xls if num1>=num else target_xls
#                         循環次數由最外成的for循環控制,返回最少的行數
                        for tar_num in target_xls:
                            if origin_xls[ori_num]==target_xls[tar_num]:
                                flag='true'
                                break              #如果匹配到結果退出循環
                        if flag=='true':           #匹配上結果輸出後臺日誌
                            log.info(' 文件:{}, row:{}is ok'.format(ori_path,ori_num+1))
                            success+=1
                        else:                      #匹配不上將源表中行記錄寫入txt
                            log.info('文件:{} row:{} is different'.format(ori_path,ori_num+1))
                            fail+=1
                            data=origin_xls[ori_num]
                            try:
                                data1=target_xls[ori_num]
                            except:
#                                 避免對比最小行數,之後索引不足,
                                log.info("{}最大隻有這麼多行:{}".format(tar_path,tar_num))
                            logstr='文件:{},【不一致】row<{}>:{} vs {}'.format(ori_path,ori_num+1,data,data1)
                            write_file(logname,logstr)
                    logstr='【比對完成】總記錄數:{:d}條,一致:{:d}條,不一致:{:d}條'.format(ori_num + 1,success,fail)
                    log.info(' 【{}】比對結束'.format(sheet_ori.name))
                    log.info(' 總記錄數:{}條,一致:{}條,不一致:{}條'.format(ori_num+1,success,fail))
                    write_file(logname,logstr)
                else:
                    for tar_num in target_xls:
                        flag = 'false'  # 判斷是否一致標誌
                        for ori_num in origin_xls:
                            if target_xls[tar_num] == origin_xls[ori_num]:
                                flag = 'true'
                                break  # 如果匹配到結果退出循環
                        if flag == 'true':  # 匹配上結果輸出後臺日誌
                            log.info(' 文件: {} row:{} is ok'.format(tar_path,tar_num + 1))
                            success += 1
                        else:  # 匹配不上將源表中行記錄寫入txt
                            log.info(' 文件: {}, row:{} is different'.format(tar_path,tar_num + 1))
                            fail += 1
                            data = target_xls[tar_num]
                            logstr = '【不一致】row<' + str(tar_num + 1) + '>:' + str(data)
                            write_file(logname, logstr)
                    logstr = '【比對完成】總記錄數:{:d}條,一致:{:d}條,不一致:{:d}條'.format(tar_num + 1, success, fail)
                    log.info("【{}】比對結束".format(sheet_tar.name))
                    log.info('總記錄數:{}條,一致:{}條,不一致:{}條'.format(tar_num + 1, success, fail))
                    write_file(logname, logstr)
        else:
            log.info("{}子表名不一致".format(sub_name))
    except Exception as e:
        log.info(e)
        raise e
    
if __name__ == '__main__':
    
    read_excel(config.data_path+"test123.xlsx",config.data_path+"test.xlsx","Sheet1")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章