「Python實用秘技10」深度比較Python對象間差異

本文完整示例代碼及文件已上傳至我的Github倉庫//github.com/CNFeffery/PythonPracticalSkills

  這是我的系列文章「Python實用秘技」的第10期,本系列立足於筆者日常工作中使用Python積累的心得體會,每一期為大家帶來一個幾分鐘內就可學會的簡單小技巧。

  作為系列第10期,我們即將學習的是:深度比較Python對象間差異。

  很多情況下我們需要對兩條數據之間的差異進行比較,如果僅僅是針對數值型對象,那麼兩者的差值就是所謂的差異,但是如果要比較兩條JSON數據間的差異呢?

  由於JSON數據具有可嵌套可分層的特點,想要明確找出兩條JSON數據間的差異並加以描述,如果自己書寫方法還是有些費事。這種情況我們就可以使用到第三方庫deepdiff中的DeepDiff()方法,它基於遞歸對不同對象進行深度比較。

  使用pip install deepdiff完成安裝之後,通過from deepdiff import DeepDiff導入所需功能,就可以直接對兩個JSON對象之間的差異進行比較,下面是一個簡單的例子:

from deepdiff import DeepDiff

obj1 = {
    'level1': [
        {
            'level1-1': 1,
            'level1-2': 1,
            'level1-3': [
                {
                    'level1-3-1': [1, 2, 3]
                }
            ]
        }
    ],
    'level2': 'a'
}

obj2 = {
    'level1': [
        {
            'level1-1': 1,
            'level1-2': 1,
            'level1-3': [
                {
                    'level1-3-1': [1, 2, 1]
                }
            ]
        }
    ],
    'level2': 'b'
}

DeepDiff(obj1, obj2)

  可以看到打印的檢測結果中具體聲明了差異內容及具體位置,可以幫助我們開展後續其他處理。

  除此之外,deepdiff還具有非常豐富的額外功能,譬如忽略對指定類型數據的比較檢查:

  亦或是通過定義層次規則,令DeepDiff()跳過對指定位置元素的差異檢查:

  還支持利用正則表達式定義要忽略的模糊層次規則,譬如下面的例子中我們使用正則批量忽略了多個鍵值對:

  限制針對浮點數的檢查精度,譬如下面的例子中限定significant_digits=2後,小數點後第二位以後的差異便被忽略:

  更多用法,感興趣的讀者朋友可以移步//zepworks.com/deepdiff/5.8.2/diff.html了解更多。


  本期分享結束,咱們下回見~👋

Tags: