python數據對比功能,可做RF關鍵字


# -*- coding: utf-8 -*-
import json
import os

class CompareData:
    def read_json_from_file(self,fileDir):
        '''
        讀取.json文件內的json數據
        入參:fileDir為文件的絕對路徑
        返回:.json文件里的json數據
        '''
        # print("當前路徑 -> %s" %os.getcwd())
        with open(fileDir) as json_file:
            json_data = json.load(json_file)
        return json_data

    def compare_json_value(self,data,dataOld,*ignore):
        # 統計丟失的數據
        self.lostData = []
        # 統計列表多出的數據個數
        self.surplusData = []
        # 統計不同的數據(不包括丟失的數據)
        self.differentData = []
        self.compare_dic_value(data, dataOld, None, *ignore)
        result = {"lostData":self.lostData,"surplusData":self.surplusData,"differentData":self.differentData}
        return result

    def compare_dic_value(self,data,dataOld,dicLevel,*ignore):
        for item in dataOld:
            if dicLevel == None:
                preDicLevel = item
            else:
                preDicLevel = dicLevel + "." + item
            # print ("當前層級:" + preDicLevel)
            if preDicLevel not in ignore:
                newValue = data.get(item, "getItemErrorCK")
                if newValue == "getItemErrorCK":
                    lost_data = {"dicLevel":preDicLevel,"dataOld":dataOld[item]}
                    self.lostData.append(lost_data)
                    print('*WARN*' + ' 丟失數據: ' + str(preDicLevel) + "--老接口數據為" + str(dataOld[item]))
                else:
                    if isinstance(dataOld[item], list):
                        # assert len(dataOld[item]) == len(data[item])
                        print("是個list")
                        self.compare_list_value(data[item], dataOld[item], preDicLevel, *ignore)
                    elif isinstance(dataOld[item], dict):
                        print("是個dic")
                        self.compare_dic_value(data[item], dataOld[item], preDicLevel, *ignore)
                    else:
                        self.compare_basic_value(data[item], dataOld[item], preDicLevel)
    
    def compare_list_value(self,data,dataOld,dicLevel,*ignore):
        #新數據比老數據中列表多出的數據
        if len(data) > len(dataOld):
            for i in range(len(dataOld), len(data)):
                preDicLevel = dicLevel + "." + str(i)
                if preDicLevel not in ignore:
                    surplus_data = {"dicLevel":preDicLevel,"dataError":data[i]}
                    self.surplusData.append(surplus_data)
                    print('*WARN*' + ' 列表多出數據: ' + str(preDicLevel))

        for i in range(len(dataOld)):
            preDicLevel = dicLevel + "." + str(i)
            # print ("當前層級:" + preDicLevel)
            if i + 1 <= len(data):
                if preDicLevel not in ignore:
                    if isinstance(dataOld[i], list):
                        assert len(dataOld[i]) == len(data[i])
                        self.compare_list_value(data[i], dataOld[i], preDicLevel, *ignore)
                    elif isinstance(dataOld[i], dict):
                        self.compare_dic_value(data[i], dataOld[i], preDicLevel, *ignore)
                    else:
                        self.compare_basic_value(data[i], dataOld[i], preDicLevel)
            else:
                #新數據比老數據中列表丟失的數據
                lost_data = {"dicLevel":preDicLevel,"dataOld":dataOld[i]}
                self.lostData.append(lost_data)

    def compare_basic_value(self,data,dataOld,dicLevel):
        if data != dataOld:
                print('*WARN*' + ' 數據不一致: ' + str(dicLevel) + "--老接口數據為" + str(
                    dataOld) + "--新接口數據為" + str(data))
                dif_data = {"dicLevel":dicLevel,"dataError":data,"dataOld":dataOld}
                self.differentData.append(dif_data)

    
    def compare_json_key(self,data,dataOld,*ignore):
        # 統計丟失的數據
        self.lostData = []
        # 統計列表多出的數據個數
        self.surplusData = []
        # 統計不同的數據(不包括丟失的數據)
        self.differentData = []
        self.compare_dic_key(data, dataOld, None, *ignore)
        result = {"lostData":self.lostData,"surplusData":self.surplusData,"differentData":self.differentData}
        return result

    def compare_dic_key(self,data,dataOld,dicLevel,*ignore):
        for item in dataOld:
            if dicLevel == None:
                preDicLevel = item
            else:
                preDicLevel = dicLevel + "." + item
            # print ("當前層級:" + preDicLevel)
            if preDicLevel not in ignore:
                newValue = data.get(item, "getItemErrorCK")
                if newValue == "getItemErrorCK":
                    lost_data = {"dicLevel":preDicLevel,"dataOld":dataOld[item]}
                    self.lostData.append(lost_data)
                    print('*WARN*' + ' 丟失數據: ' + str(preDicLevel) + "--老接口數據為" + str(dataOld[item]))
                else:
                    if isinstance(dataOld[item], list):
                        # assert len(dataOld[item]) == len(data[item])
                        print("是個list")
                        self.compare_list_key(data[item], dataOld[item], preDicLevel, *ignore)
                    elif isinstance(dataOld[item], dict):
                        print("是個dic")
                        self.compare_dic_key(data[item], dataOld[item], preDicLevel, *ignore)
    
    def compare_list_key(self,data,dataOld,dicLevel,*ignore):
        #新數據比老數據中列表多出的數據
        if len(data) > len(dataOld):
            for i in range(len(dataOld), len(data)):
                preDicLevel = dicLevel + "." + str(i)
                if preDicLevel not in ignore:
                    surplus_data = {"dicLevel":preDicLevel,"dataError":data[i]}
                    self.surplusData.append(surplus_data)
                    print('*WARN*' + ' 列表多出數據: ' + str(preDicLevel))

        for i in range(len(dataOld)):
            preDicLevel = dicLevel + "." + str(i)
            # print ("當前層級:" + preDicLevel)
            if i + 1 <= len(data):
                if preDicLevel not in ignore:
                    if isinstance(dataOld[i], list):
                        assert len(dataOld[i]) == len(data[i])
                        self.compare_list_key(data[i], dataOld[i], preDicLevel, *ignore)
                    elif isinstance(dataOld[i], dict):
                        self.compare_dic_key(data[i], dataOld[i], preDicLevel, *ignore)
                    
            else:
                #新數據比老數據中列表丟失的數據
                lost_data = {"dicLevel":preDicLevel,"dataOld":dataOld[i]}
                self.lostData.append(lost_data)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM