zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    设置div内的内容不能被选中
    js中!和!!的区别及用法
    echars自定义提示框位置
    数组排序
    查询一个表的不同数据,显示到一个表
    document.body
    设置fixed,横向滚动条失效
    scrollTop
    JS 数组
    JS 数学函数
  • 原文地址:https://www.cnblogs.com/hzh1028/p/11287559.html
Copyright © 2011-2022 走看看