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)

 

posted @ 2019-08-02 11:28  crazy_h  阅读(1314)  评论(0编辑  收藏  举报