deepdiff比较两个json文件数据差异性
Python代码片
:
import json
import sys
from 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 排序时忽略
@staticmethod
def 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 md5
def 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 忽略比对的字段key
ignore_fields = ['wid']
diff_json("file/no1.json", "file/no2.json", ['wid'])