deepdiff比较两个json文件数据差异性
deepdiff比较两个json文件数据差异性
Python代码片
:
import json
import sysfrom deepdiff import DeepDiff
from deepdiff import grep, DeepSearch
from deepdiff import DeepHash# print(DeepDiff("abc", "abcd", ignore_order=True))class CompareJson:"""比较两个json格式的数据文件"""def read_json(self, filename):'''读取json格式的数据'''try:with open(filename, 'r', encoding='utf-8') as fileHandle:text = fileHandle.read()return json.loads(text)except IOError as e:print("Read file Error:" + e)sys.exit()# 1、type_changes:类型改变的key# 2、values_changed:值发生变化的key# 3、dictionary_item_added:字典key添加# 4、dictionary_item_removed:字段key删除# exclude_paths 排除指定的字段# ignore_order 排序时忽略@staticmethoddef diff_json(filename1, filename2):d_dict = DeepDiff(CompareJson().read_json(filename1),CompareJson().read_json(filename2), ignore_order=True)if d_dict == {}:print("两个文件内容一致")for k, v in d_dict.items():if k == "type_changes":print("类型改变的key:", v)elif k == "values_changed":print("值发生变化的key:", v)elif k == "dictionary_item_added":print("字典key添加:", v)elif k == "dictionary_item_removed":print("字段key删除:", v)CompareJson.diff_json("../file/no1.json", "../file/no2.json")
生成可实话HTML文件:代码块
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import difflib
import json
import sys
import time
from hashlib import md5def read_json(filename):'''读取json格式的数据'''try:with open(filename, 'r', encoding='utf-8') as fileHandle:text = fileHandle.read().replace(' ', '')return json.loads(text)except IOError as e:print("Read file Error:" + e)sys.exit()def md5_file(filename):'''比较两个文件内容的md5值'''m = md5()try:with open(filename, 'rb') as a_file: # 需要使用二进制格式读取文件内容m.update(a_file.read())except Exception as e:print("文件读取失败:%s" % e)return m.hexdigest()def diff_json(filename1, filename2, ignore_fields):'''比较两个json格式的数据文件,不同之处输出到html文件中'''file1Md5 = md5_file(filename1)file2Md5 = md5_file(filename2)if file1Md5 != file2Md5:text1_lines = read_json(filename1)text2_lines = read_json(filename2)a_filtered = {k: v for k, v in text1_lines.items() if k not in ignore_fields}b_filtered = {k: v for k, v in text2_lines.items() if k not in ignore_fields}d = difflib.HtmlDiff()# context=True时只显示差异的上下文,默认显示5行,由numlines参数控制,context=False显示全文,差异部分颜色高亮,默认为显示全文result = d.make_file(sorted(a_filtered), sorted(b_filtered), filename1, filename2, context=True)# 内容保存到result.html文件中print('json数据比对结果写入html中.')with open('file/{}_diff.html'.format(time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime())), 'w', encoding='utf-8') as result_file:result_file.write(result)else:print('两个文件内容一致')if __name__ == '__main__':# ignore_fields 忽略比对的字段keyignore_fields = ['wid']diff_json("file/no1.json", "file/no2.json", ['wid'])