DeepDiff 深度差异比较工具基础教程

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),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张亭齐Crown

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值