DeepDiff 深度差异比较工具基础教程
DeepDiff 是一个强大的 Python 库,专门用于比较两个 Python 对象之间的差异。无论是简单的数据结构还是复杂的嵌套对象,DeepDiff 都能准确地找出它们之间的区别。本文将详细介绍 DeepDiff 的基本用法和核心功能。
安装与导入
首先需要安装 DeepDiff 库,安装完成后可以通过以下方式导入:
from deepdiff import DeepDiff
from pprint import pprint # 用于美化输出
基础比较功能
相同对象比较
当比较两个完全相同的对象时,DeepDiff 会返回一个空字典:
t1 = {1:1, 2:2, 3:3}
t2 = t1
print(DeepDiff(t1, t2)) # 输出: {}
类型变化检测
DeepDiff 能够检测对象中元素类型的变化:
t1 = {1:1, 2:2, 3:3}
t2 = {1:1, 2:"2", 3:3}
pprint(DeepDiff(t1, t2), indent=2)
输出会显示键 2
的值从整数类型变成了字符串类型。
值变化检测
检测对象中值的变化:
t1 = {1:1, 2:2, 3:3}
t2 = {1:1, 2:4, 3:3}
pprint(DeepDiff(t1, t2, verbose_level=0), indent=2)
元素增删检测
DeepDiff 可以检测字典中元素的增加和删除:
t1 = {1:1, 3:3, 4:4}
t2 = {1:1, 3:3, 5:5, 6:6}
ddiff = DeepDiff(t1, t2)
pprint(ddiff)
通过设置 verbose_level=2
可以查看增加或删除元素的具体值:
ddiff = DeepDiff(t1, t2, verbose_level=2)
pprint(ddiff, indent=2)
高级比较功能
字符串差异比较
对于字符串差异,DeepDiff 可以提供类似 git diff 的差异输出:
t1 = {4:{"b":"world!\nGoodbye!\n1\n2\nEnd"}}
t2 = {4:{"b":"world\n1\n2\nEnd"}}
ddiff = DeepDiff(t1, t2)
print(ddiff['values_changed']["root[4]['b']"]["diff"])
输出将显示具体的行级差异。
列表差异比较
比较列表内容的变化:
t1 = {4:{"b":[1, 2, 3, 4]}}
t2 = {4:{"b":[1, 2]}}
ddiff = DeepDiff(t1, t2)
集合比较
比较集合的差异:
t1 = {1, 2, 8}
t2 = {1, 2, 3, 5}
ddiff = DeepDiff(t1, t2)
自定义对象比较
DeepDiff 可以比较自定义类的实例:
class ClassA:
a = 1
def __init__(self, b):
self.b = b
t1 = ClassA(1)
t2 = ClassA(2)
pprint(DeepDiff(t1, t2))
日期时间比较
DeepDiff 会自动将所有日期时间转换为 UTC 进行比较:
from datetime import datetime, timezone
d1 = datetime(2020, 8, 31, 13, 14, 1)
d2 = datetime(2020, 8, 31, 13, 14, 1, tzinfo=timezone.utc)
DeepDiff(d1, d2) # 返回 {}
数据分组比较
基本分组(group_by)
当处理字典列表时,可以使用 group_by
参数按指定键分组:
t1 = [{'id': 'AA', 'name': 'Joe'}, {'id': 'BB', 'name': 'James'}]
t2 = [{'id': 'AA', 'name': 'Joe'}, {'id': 'BB', 'name': 'Jim'}]
DeepDiff(t1, t2, group_by='id')
二维分组
支持按多个键进行分组:
DeepDiff(t1, t2, group_by=['id', 'name'])
分组排序(group_by_sort_key)
当分组键有重复值时,可以使用 group_by_sort_key
指定排序方式:
DeepDiff(t1, t2, group_by='id', group_by_sort_key='name')
时区处理
DeepDiff 默认使用 UTC 时区,但可以通过 default_timezone
参数修改:
import pytz
dt_ny = datetime(2025, 2, 3, 7, 0, tzinfo=pytz.timezone('America/New_York'))
dt_ny2 = datetime(2025, 2, 3, 6, 0, tzinfo=pytz.timezone('America/New_York'))
DeepDiff(dt_ny, dt_ny2, default_timezone=pytz.timezone('America/New_York'))
总结
DeepDiff 是一个功能强大的差异比较工具,能够处理各种 Python 数据结构,包括:
- 基本数据类型比较
- 复杂嵌套结构比较
- 自定义对象比较
- 日期时间处理
- 数据分组比较
通过合理使用各种参数,可以满足不同场景下的差异比较需求。对于需要精确比较 Python 对象差异的场景,DeepDiff 是一个非常实用的工具。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考