# -*- coding: UTF-8 -*-
"""=========================================================
@Project -> File: 数据版本统计 -> get_json_diff
@IDE: PyCharm
@author: lxc
@date: 2023/2/27 上午 11:06
@Desc:
1-功能描述:
比对两个字典的差别,返回后者减去前者的的值,字典形状不变
注意:
1. 两字典形状必须相同;
2. 两字典的值必须均为int类型或数字字符串(99和'99'均可)
2-实现步骤
1-设立模板字典,形状和两字典相同,且value均改为0
2-使用dictdiffer库,找出两个字典的差别所在,并将value求差,填充进模板字典内
"""
import copy
from dictdiffer import diff
import logging
logger = logging.getLogger(__name__)
def get_differences(first, second):
differences = list(diff(first, second))
dic = change_value_to_zero(second)
while True:
break
for item in differences:
string = "dic"
try:
value = int(item[2][1]) - int(item[2][0])
except Exception as e:
logger.error(f"{item[1]}:::该键对应的value非int类型,无法进行求差值\\\n{e}")
value = None
if type(item[1]) == str:
key_chains = item[1].split('.')
string += ''.join([f"['{key}']" for key in key_chains]) + " = %s" % value
elif type(item[1]) == list:
key_chains = item[1]
for key in key_chains:
if type(key) == str:
string += f"['{key}']"
elif type(key) == int:
string += f"[{key}]"
else:
raise TypeError("找差值存在键类型错误: 非字符串或列表")
string += " = %s" % value
else:
raise TypeError("找差值存在键类型错误: 非字符串或列表")
exec(string)
return dic
def get_targe_value(request_body):
# 循环字典,获取键、值
for key, values in request_body.items():
# 判断值的type类型,如果是list,调用get_list() 函数,
if type(values) == list:
get_list(values)
# 如果是字典,调用自身
elif type(values) == dict:
get_targe_value(values)
# 如果值不是list且是需要被替换的,就替换掉
elif type(values) != list and type(values) == int:
request_body[key] = 0
else:
pass
def get_list(values):
for rustle in values:
if type(rustle) == list:
get_list(values)
else:
get_targe_value(rustle)
def change_value_to_zero(item):
result = copy.deepcopy(item)
get_targe_value(result)
return result
if __name__ == '__main__':
dict2 = {"num_industries": {"9-汽车及零部件": [{"30-智能家电": "848645"}, {"11-激光装备": 2795}, {
"30-智能家电": [{"30-智能家电": 9168}, {"11-激光装备": 2799}, {"30-智能家电": 9164}]}], "30-智能家电": 9163,
"11-激光装备": 2795, "12-膜材料": 1356, "32090001-集成电路": 416,
"29-畜禽和水产品精深加工": 6506, "8-功能玻璃": 7742, "19-化学纤维": 4668,
"32-造纸": 967,
"18-大数据+产业链": 10569, "27-绿色建材": 9407, "14-集成电路": 21250,
"24-纺织服装": 10802,
"28-半固态成型制造": 9210, "22-酿造(酒)": 8956, "32060001-南通光电": 0,
"23-食品加工": 10502, "10-生物医药": 745827, "31-网络可视化": 1205,
"26-高端家居": 10874,
"21-有机新材料": 12900, "20-晶硅光伏": 16825, "25-电子元器件": 14848,
"15-动力电池": 9595},
"total_num": 26304548}
dict1 = {"num_industries": {"9-汽车及零部件": [{"30-智能家电": 9168}, {"11-激光装备": 2799}, {
"30-智能家电": [{"30-智能家电": 9148}, {"11-激光装备": 2793}, {"30-智能家电": 9134}]}], "30-智能家电": 9163,
"11-激光装备": 2795, "12-膜材料": 1356, "32090001-集成电路": 416,
"29-畜禽和水产品精深加工": 6506, "8-功能玻璃": 7742, "19-化学纤维": 4668,
"32-造纸": 967,
"18-大数据+产业链": 10569, "27-绿色建材": 9407, "14-集成电路": 21250,
"24-纺织服装": 10802,
"28-半固态成型制造": 9210, "22-酿造(酒)": 8956, "32060001-南通光电": 0,
"23-食品加工": 10502, "10-生物医药": 745827, "31-网络可视化": 1205,
"26-高端家居": 10874,
"21-有机新材料": 12900, "20-晶硅光伏": 16818, "25-电子元器件": 14848,
"15-动力电池": 9595},
"total_num": 26304539}
print(dict1)
print(dict2)
result = get_differences(dict1, dict2)
print(result)