deepdiff库基本用法

deepdiff 库是一个 Python 库,提供了一种比较两个 Python 对象之间差异的方法,支持比较的对象类型包括字典、列表、元组、集合等。下面介绍一下 deepdiff 库的具体用法和解释:

安装 deepdiff 库

可以使用 pip 命令来安装 deepdiff 库。在终端或命令行中输入以下命令即可安装:

pip install deepdiff

导入 deepdiff 库

在 Python 代码中导入 deepdiff 库,可以使用以下语句:

from deepdiff import DeepDiff

比较两个 Python 对象

在 deepdiff 库中,可以使用 DeepDiff 类比较两个 Python 对象之间的差异。DeepDiff 类的初始化方法如下:

diff = DeepDiff(obj1, obj2, ignore_order=True)

其中,obj1 和 obj2 分别表示要比较的两个 Python 对象,ignore_order=True 表示在比较列表或集合等可迭代对象时,忽略元素的顺序。

获取差异结果

比较完成后,可以使用 DeepDiff 对象的 to_dict() 方法来获取差异结果,结果以字典形式返回。字典中的键表示差异类型,比如 dictionary_item_added、dictionary_item_removed、values_changed 等,而值则表示相应的差异结果。例如:

diff_dict = diff.to_dict()

处理差异结果

根据不同的差异类型,可以采取不同的处理方式。常见的处理方式包括打印差异结果、将差异结果写入日志文件、向用户提示差异信息等。例如,如果要打印差异结果,可以使用以下代码:

for k, v in diff_dict.items():
    print(f"{k}: {v}")

deepdiff 库的基本用法和解释。

不同对象的比较规则

在 deepdiff 库中,不同类型的 Python 对象有不同的比较规则。下面我们分别介绍一下各种对象类型的比较规则:

字典(dict)对象

对于字典对象,比较规则如下:
如果两个字典对象的键和值都相同,则认为它们是相同的。
如果两个字典对象的键相同但值不同,则认为它们是不同的,此时会将键值对添加到差异结果中。
如果两个字典对象的键不同,则认为它们是不同的,此时会将键值对添加到差异结果中。

列表(list)对象和元组(tuple)对象

对于列表和元组对象,比较规则如下:
如果两个列表或元组对象的长度相同,且每个元素在相应位置上都相同,则认为它们是相同的。
如果两个列表或元组对象的长度不同,则认为它们是不同的,此时会将元素添加到差异结果中。
如果两个列表或元组对象的长度相同,但有元素在相应位置上不同,则认为它们是不同的,此时会将元素添加到差异结果中。

集合(set)对象

对于集合对象,比较规则如下:

如果两个集合对象的元素相同,则认为它们是相同的。
如果两个集合对象的元素不同,则认为它们是不同的,此时会将元素添加到差异结果中。
其他对象类型
对于其他对象类型,比较规则如下:
如果两个对象是同一个对象,则认为它们是相同的。
如果两个对象在类型上不同,则认为它们是不同的,此时会将对象添加到差异结果中。
如果两个对象在类型上相同,但值不同,则认为它们是不同的,此时会将对象添加到差异结果中。
需要注意的是,在比较可迭代对象时,可以使用 ignore_order 参数来忽略元素的顺序。如果 ignore_order 参数为 True,则认为两个可迭代对象的元素相同,只要它们在不同位置上出现即可。

json对象的详细比较规则

在 deepdiff 库中,支持比较 JSON 格式的数据。通常,我们将 JSON 格式的数据解析成 Python 字典或列表对象,再进行比较。对于 JSON 数据,比较规则如下:

如果两个 JSON 对象的键和值都相同,则认为它们是相同的。

如果两个 JSON 对象的键相同但值不同,则认为它们是不同的,此时会将键值对添加到差异结果中。

如果两个 JSON 对象的键不同,则认为它们是不同的,此时会将键值对添加到差异结果中。

如果两个 JSON 数组对象的长度相同,且每个元素在相应位置上都相同,则认为它们是相同的。

如果两个 JSON 数组对象的长度不同,则认为它们是不同的,此时会将元素添加到差异结果中。

如果两个 JSON 数组对象的长度相同,但有元素在相应位置上不同,则认为它们是不同的,此时会将元素添加到差异结果中。

如果两个 JSON 对象在类型上不同,则认为它们是不同的,此时会将对象添加到差异结果中。

如果两个 JSON 对象在类型上相同,但值不同,则认为它们是不同的,此时会将对象添加到差异结果中。
需要注意的是,在比较 JSON 数据时,需要将 JSON 数据解析成 Python 对象进行比较,比较结果也是以 Python 对象的形式返回。在解析 JSON 数据时,可以使用 Python 内置的 json 模块进行解析。例如:

import json
from deepdiff import DeepDiff
json_str1 = '{"name": "Alice", "age": 18}'
json_str2 = '{"name": "Bob", "age": 20}'
obj1 = json.loads(json_str1)
obj2 = json.loads(json_str2)
diff = DeepDiff(obj1, obj2)
diff_dict = diff.to_dict()

在上面的例子中,我们首先使用 json.loads() 方法将 JSON 字符串解析成 Python 对象,然后使用 DeepDiff 类比较两个 Python 对象之间的差异并获取差异结果。

deepdiff 库提供的差异结果中可能包含以下 key:

  • dictionary_item_added: 记录字典中新增的键值对,值为新增的值。

  • dictionary_item_removed: 记录字典中被删除的键值对,值为被删除的值。

  • values_changed: 记录值发生变化的键值对,值为一个字典,包含变化前后的值。

  • iterable_item_added: 记录可迭代对象中新增的元素,值为新增的元素。

  • iterable_item_removed: 记录可迭代对象中被删除的元素,值为被删除的元素。

  • type_changes: 记录数据类型发生变化的情况,值为一个字典,包含变化前后的类型。

  • set_item_added: 记录集合中新增的元素,值为新增的元素。

  • set_item_removed: 记录集合中被删除的元素,值为被删除的元素。

  • attribute_added: 记录对象新增的属性,值为新增属性的值。

  • attribute_removed: 记录对象被删除的属性,值为被删除属性的值。

  • object_deleted: 记录被删除的对象,值为 None。

  • object_created: 记录新增的对象,值为新增的对象。

  • name_changed: 记录对象属性名发生变化的情况,值为一个字典,包含变化前后的属性名。

  • unchanged: 记录没有变化的对象,值为未变化的对象。

  • repetition_change: 记录重复元素发生变化的情况,值为一个字典,包含变化前后的重复元素。

  • unprocessed: 记录无法处理的差异情况,值为出现差异的对象。
    这些 key 可以通过 DeepDiff 类的 to_dict() 方法转换成字典,也可以通过 DeepDiff 类的 to_json() 方法转换成 JSON 格式的字符串。

    ignore_order=True

    ignore_order=True 的意思是忽略集合或列表中元素的顺序。当 DeepDiff 对象检测到 ignore_order=True 时,它将比较两个集合或列表中的元素,而不考虑它们的顺序。因此,即使两个集合或列表中的元素不按相同的顺序排列,它们仍将被视为相等。也就是说,当 ignore_order=True 时,差异结果中会忽略元素的顺序,只关注元素是否存在、新增、删除或者修改等差异。
    需要注意的是,ignore_order=True 只适用于集合和列表,不适用于字典、字符串等其他数据类型的比较。如果需要忽略字典中键值对的顺序,可以使用 sort_dicts=True 参数。


  目录