Python对比校验神器deepdiff库使用详解
工作中我们经常要两段代码的区别,或者需要查看接口返回的字段与预期是否一致,如何快速定位出两者的差异?除了一些对比的工具比如Beyond Compare、WinMerge等,或者命令工具diff(在linux环境下使用),其实Python中也提供了很多实现对比的库,比如deepdiff和difflib,这两个的区别是deepdiff显示的对比效果比较简洁,但是可以设置忽略的字段,difflib显示的对比结果可以是html的,比较详细。今天我们就学习一下快速实现代码和文件对比的库–deepdiff。
前言
在接口自动化中会遇到想要得出两次响应体(json值)差异,本篇来学习的deepdiff库可以解决这问题
deepdiff库
安装
pip install deepdiff
说明
deepdiff模块常用来校验两个对象是否一致,并找出其中差异之处,它提供了:
deepdiff模块常用来校验两个对象是否一致,并找出其中差异之处,它提供了:
- DeepDiff:比较两个对象,对象可以是字段、字符串等可迭代的对象
- DeepSearch:在对象中搜索其他对象
- DeepHash:根据对象的内容进行哈希处理
DeepDiff
- 作用:比较两个对象,对象可以是字段、字符串等可迭代的对象
说明:
- type_changes:类型改变的key
- values_changed:值发生变化的key
- dictionary_item_added:字典key添加
- dictionary_item_removed:字段key删除
对比json
# -*-coding:utf-8一*- # @Time:2023/4/16 # @Author: DH from deepdiff import DeepDiff # json校验 json_one = { 'code': 0, "message": "失败", 'data': { 'id': 1 } } json_two = { 'code': 1, "message": "成功", 'data': { 'id': 1 } } print(DeepDiff(json_one, json_two)) # 输出 """ {'values_changed': {"root['code']": {'new_value': 1, 'old_value': 0}, "root['message']": {'new_value': '成功', 'old_value': '失败'}}} root['code'] : 改变值的路径 new_value : 新值 old_value :原值 """
列表校验
cutoff_distance_for_pairs: (1 >= float > 0,默认值=0.3);通常结合ignore_order=true使用,用于结果中展示差异的深度。值越高,则结果中展示的差异深度越高。
from deepdiff import DeepDiff t1 = [[[1.0, 666], 888]] t2 = [[[20.0, 666], 999]] print(DeepDiff(t1, t2, ignore_order=True, cutoff_distance_for_pairs=0.5)) print(DeepDiff(t1, t2, ignore_order=True)) # 默认为0.3 print(DeepDiff(t1, t2, ignore_order=True, cutoff_distance_for_pairs=0.2)) """ {'values_changed': {'root[0][0]': {'new_value': [20.0, 666], 'old_value': [1.0, 666]}, 'root[0][1]': {'new_value': 999, 'old_value': 888}}} {'values_changed': {'root[0]': {'new_value': [[20.0, 666], 999], 'old_value': [[1.0, 666], 888]}}} {'values_changed': {'root[0]': {'new_value': [[20.0, 666], 999], 'old_value': [[1.0, 666], 888]}}} """
忽略字符串类型
ignore_string_type_changes :忽略校验字符串类型,默认为False
print(DeepDiff(b'hello', 'hello', ignore_string_type_changes=True)) print(DeepDiff(b'hello', 'hello')) """ 输出: {} {'type_changes': {'root': {'old_type': <class 'bytes'>, 'new_type': <class 'str'>, 'old_value': b'hello', 'new_value': 'hello'}}} """
忽略大小写
ignore_string_case:忽略大小写,默认为False
from deepdiff import DeepDiff print(DeepDiff(t1='Hello', t2='heLLO')) print(DeepDiff(t1='Hello', t2='heLLO', ignore_string_case=True)) """ 输出: {'values_changed': {'root': {'new_value': 'heLLO', 'old_value': 'Hello'}}} {} """
DeepSearch
作用:在对象中搜索其他对象 查找字典key/value
from deepdiff import DeepSearch json_three = { 'code': 1, "message": "成功", 'data': { 'id': 1 } } # 查找key print(DeepSearch(json_three, "code")) print(DeepSearch(json_three, "name")) # 查找value print(DeepSearch(json_three, 1)) """ 输出: {'matched_paths': ["root['code']"]} {} {'matched_values': ["root['code']", "root['data']['id']"]} """ # 正则 use_regexp obj = ["long somewhere", "string", 0, "somewhere great!"] # 使用正则表达式 item = "some*" ds = DeepSearch(obj, item, use_regexp=True) print(ds) # 强校验 strict_checking 默认True item = '0' ds = DeepSearch(obj, item, strict_checking=False) # ds = DeepSearch(obj, item) # 默认True print(ds) # 大小写敏感 case_sensitive 默认 False 敏感 item = 'someWhere' ds = DeepSearch(obj, item, case_sensitive=True) print(ds)
DeepHash
作用:根据对象的内容进行哈希处理
from deepdiff import DeepHash # 对对象进行hash json_four = { 'code': 1, "message": "成功", 'data': { 'id': 1 } } print(DeepHash(json_four))
extract
extract : 根据路径查询值
from deepdiff import extract # 根据路径查询值 obj = {1: [{'2': 666}, 3], 2: [4, 5]} path = "root[1][0]['2']" value = extract(obj, path) print(value) """ 输出: 666 """
grep
搜索
from deepdiff import grep obj = ["long somewhere", "string", 0, "somewhere great!"] item = "somewhere" ds = obj | grep(item) print(ds) # use_regexp 为True 表示支持正则 obj = ["something here", {"long": "somewhere", "someone": 2, 0: 0, "somewhere": "around"}] ds = obj | grep("some.*", use_regexp=True) print(ds) # 根据值查询路径 obj = {1: [{'2': 'b'}, 3], 2: [4, 5, 5]} result = obj | grep(5) print(result) """ 输出: {'matched_values': ['root[2][1]', 'root[2][2]']} """
到此这篇关于Python-对比校验神器-deepdiff库的文章就介绍到这了,更多相关Python对比库deepdiff内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
使用Python中PDB模块中的命令来调试Python代码的教程
这篇文章主要介绍了使用Python中PDB模块中的命令来调试Python代码的教程,包括设置断点来修改代码等、对于Python团队项目工作有一定帮助,需要的朋友可以参考下2015-03-03python点云地面点滤波(Progressive Morphological Filter)算法介绍(PCL库)
这篇文章主要介绍了python点云地面点滤波(Progressive Morphological Filter)算法介绍(PCL库),了解膨胀/腐蚀这两个基础操作,可以通过对其进行简单组合来形成开/闭操作,需要的朋友可以参考下2021-08-08Flask框架Flask-Principal基本用法实例分析
这篇文章主要介绍了Flask框架Flask-Principal基本用法,结合实例形式分析了Flask框架flask-principal扩展的基本功能、安装、使用方法及相关操作注意事项,需要的朋友可以参考下2018-07-07
最新评论