Các ví dụ về DeepDiff Python

Thư viện DeepDiff được sử dụng để thực hiện tìm kiếm và sự khác biệt trong các đối tượng Python. Nó đi kèm với ba hoạt động

  • DeepDiff. Sự khác biệt sâu sắc của từ điển, iterables, chuỗi và các đối tượng khác. Nó sẽ đệ quy tìm kiếm tất cả các thay đổi
  • Tìm kiếm nâng cao. Tìm kiếm các đối tượng trong các đối tượng khác
  • DeepHash. Băm bất kỳ đối tượng nào dựa trên nội dung của chúng ngay cả khi chúng không “có thể băm được”

Cài đặt từ PyPi

pip install deepdiff

Tìm kiếm nâng cao

Tìm kiếm sâu bên trong các đối tượng để tìm mục phù hợp với tiêu chí của bạn

Lưu ý rằng đó là tìm kiếm đường dẫn phù hợp với tiêu chí của bạn hoặc từ trong một mục

ví dụ

  • nhập khẩu

    from deepdiff import DeepSearch, grep
    

DeepSearch đi kèm với chức năng grep dễ nhớ hơn

Tìm kiếm trong danh sách cho chuỗi

>>> obj = ["long somewhere", "string", 0, "somewhere great!"]
>>> item = "somewhere"
>>> ds = obj | grep(item, verbose_level=2)
>>> print(ds)
{'matched_values': {'root[3]': 'somewhere great!', 'root[0]': 'long somewhere'}}

Tìm kiếm trong dữ liệu lồng nhau cho chuỗi

>>> obj = ["something somewhere", {"long": "somewhere", "string": 2, 0: 0, "somewhere": "around"}]
>>> item = "somewhere"
>>> ds = obj | grep(item, verbose_level=2)
>>> pprint(ds, indent=2)
{ 'matched_paths': {"root[1]['somewhere']": 'around'},
  'matched_values': { 'root[0]': 'something somewhere',
                      "root[1]['long']": 'somewhere'}}

Để lấy các khóa và giá trị của các đối tượng phù hợp, bạn có thể sử dụng đối tượng Trích xuất

>>> from deepdiff import grep
>>> obj = {1: [{'2': 'b'}, 3], 2: [4, 5]}
>>> result = obj | grep(5)
>>> result
{'matched_values': OrderedSet(['root[2][1]'])}
>>> result['matched_values'][0]
'root[2][1]'
>>> path = result['matched_values'][0]
>>> extract(obj, path)
5

Người giới thiệu

  • Trang chủ/Tài liệu
  • Tài liệu cũ

Cập nhật lần cuối. 19-04-2021

Ok các kết quả trên rõ ràng là không hữu ích lắm. DeepDiff đang so sánh các mục theo từng dòng. Thay vào đó, điều chúng tôi quan tâm là so sánh các mục dựa trên trường “nguồn” trong csv. Chúng ta có thể sử dụng cái mới

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source

{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...

loại trừ-regex-đường dẫn

Chúng tôi chỉ quan tâm đến tỷ lệ thoát và thay đổi thứ hạng trong các kết quả trên. Làm thế nào chúng ta có thể giới hạn kết quả chỉ những gì chúng ta muốn?

$ deep diff google_store_bounce_rate_2017_04.csv 
google_store_bounce_rate_2017_07.csv --group-by source
--exclude-regex-paths total_visits --exclude-regex-paths total_no_of_bounces

________số 8_______

Tuyệt vời, kết quả bây giờ hữu ích hơn

chữ số có nghĩa

Một số trong những số này quá gần nhau. Có thể chúng tôi không quan tâm nếu tỷ lệ thoát của

{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...
9 thay đổi từ 43. 71677762295505 đến 43. 265798602382986

"root['(direct)']['bounce_rate']": {
    'new_value': 43.265798602382986,
    'old_value': 43.71677762295505}

Nhưng chúng tôi quan tâm đến tỷ lệ thoát của Đối tác thay đổi gần 6%

"root['Partners']['bounce_rate']": {
    'new_value': 52.348993288590606,
    'old_value': 58.888076079005124}

DeepDiff cung cấp các tính năng mới để giải quyết vấn đề này

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source --significant-digits 0 --number-format-notation e 
--exclude-regex-paths total_visits --exclude-regex-paths total_no_of_bounces

{ 'dictionary_item_added': [root['sites.google.com'], root['dfa'], root['facebook.com']],
  'dictionary_item_removed': [root['reddit.com'], root['t.co'], root['yahoo']],
  'values_changed': { "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                      "root['google.com']['']": { 'new_value': 6,
                                                  'old_value': 7},
                      "root['google.com']['bounce_rate']": { 'new_value': 49.72826086956522,
                                                             'old_value': 43.90243902439025},
                      "root['m.facebook.com']['']": { 'new_value': 5,
                                                      'old_value': 6}}}

Tuyệt vời, chúng tôi chỉ thấy những thay đổi quan trọng nhất. Thứ hạng của

$ deep diff google_store_bounce_rate_2017_04.csv 
google_store_bounce_rate_2017_07.csv --group-by source
--exclude-regex-paths total_visits --exclude-regex-paths total_no_of_bounces
0 đã thay đổi từ 7 lên 6 trong một tháng, tỷ lệ thoát của
$ deep diff google_store_bounce_rate_2017_04.csv 
google_store_bounce_rate_2017_07.csv --group-by source
--exclude-regex-paths total_visits --exclude-regex-paths total_no_of_bounces
1 đã giảm 6% và thứ hạng của
$ deep diff google_store_bounce_rate_2017_04.csv 
google_store_bounce_rate_2017_07.csv --group-by source
--exclude-regex-paths total_visits --exclude-regex-paths total_no_of_bounces
2 cũng được cải thiện

chữ số có nghĩa đằng sau cảnh

Để hiểu cách thức hoạt động, chúng ta cần xem xét hàm

$ deep diff google_store_bounce_rate_2017_04.csv 
google_store_bounce_rate_2017_07.csv --group-by source
--exclude-regex-paths total_visits --exclude-regex-paths total_no_of_bounces
3

Hãy nhớ tỷ lệ thoát

{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...
9 đã bị loại bỏ khi chúng tôi sử dụng
$ deep diff google_store_bounce_rate_2017_04.csv 
google_store_bounce_rate_2017_07.csv --group-by source
--exclude-regex-paths total_visits --exclude-regex-paths total_no_of_bounces
5

"root['(direct)']['bounce_rate']": {
    'new_value': 43.265798602382986,
    'old_value': 43.71677762295505}

{ 'values_changed': { "root[0]['bounce_rate']": { 'new_value': 51.55729166666667,
                                                  'old_value': 46.51783094609373},
                      "root[0]['source']": { 'new_value': 'google',
                                             'old_value': '(direct)'},
                      "root[0]['total_no_of_bounces']": { 'new_value': 19798.0,
                                                          'old_value': 17440.0},
                      "root[0]['total_visits']": { 'new_value': 38400,
                                                   'old_value': 37491},
                      "root[1]['bounce_rate']": { 'new_value': 43.265798602382986,
                                                  'old_value': 52.884508297137764},
                      "root[1]['source']": { 'new_value': '(direct)',
                                             'old_value': 'google'},
                      "root[1]['total_no_of_bounces']": { 'new_value': 8606.0,
                                                          'old_value': 9497.0},
                      "root[1]['total_visits']": { 'new_value': 19891,
                                                   'old_value': 17958},
                      "root[2]['bounce_rate']": { 'new_value': 66.72964887419303,
                                                  'old_value': 67.13819368879217},
                      "root[2]['total_no_of_bounces']": { 'new_value': 4238.0,
                                                          'old_value': 1234.0},
                      "root[2]['total_visits']": { 'new_value': 6351,
                                                   'old_value': 1838},
                      "root[3]['bounce_rate']": { 'new_value': 53.9553752535497,
                                                  'old_value': 57.738435179897195},
                        ...
1

Hàm này chuyển đổi các số thành các chuỗi và "làm tròn" chúng dựa trên các chữ_số_có_nghĩa đã được chuyển. Các chữ_số_có_nghĩa là các chữ số sau dấu thập phân

Lưu ý rằng với

$ deep diff google_store_bounce_rate_2017_04.csv 
google_store_bounce_rate_2017_07.csv --group-by source
--exclude-regex-paths total_visits --exclude-regex-paths total_no_of_bounces
6, 2 số dấu phẩy động cho tỷ lệ thoát của
{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...
9 được làm tròn thành 43 và 44, điều đó có nghĩa là DeepDiff sẽ báo cáo chúng trong các kết quả khác

chữ số có nghĩa + ký hiệu định dạng số

Đó là nơi đến để chơi

"root['(direct)']['bounce_rate']": {
    'new_value': 43.265798602382986,
    'old_value': 43.71677762295505}

{ 'values_changed': { "root[0]['bounce_rate']": { 'new_value': 51.55729166666667,
                                                  'old_value': 46.51783094609373},
                      "root[0]['source']": { 'new_value': 'google',
                                             'old_value': '(direct)'},
                      "root[0]['total_no_of_bounces']": { 'new_value': 19798.0,
                                                          'old_value': 17440.0},
                      "root[0]['total_visits']": { 'new_value': 38400,
                                                   'old_value': 37491},
                      "root[1]['bounce_rate']": { 'new_value': 43.265798602382986,
                                                  'old_value': 52.884508297137764},
                      "root[1]['source']": { 'new_value': '(direct)',
                                             'old_value': 'google'},
                      "root[1]['total_no_of_bounces']": { 'new_value': 8606.0,
                                                          'old_value': 9497.0},
                      "root[1]['total_visits']": { 'new_value': 19891,
                                                   'old_value': 17958},
                      "root[2]['bounce_rate']": { 'new_value': 66.72964887419303,
                                                  'old_value': 67.13819368879217},
                      "root[2]['total_no_of_bounces']": { 'new_value': 4238.0,
                                                          'old_value': 1234.0},
                      "root[2]['total_visits']": { 'new_value': 6351,
                                                   'old_value': 1838},
                      "root[3]['bounce_rate']": { 'new_value': 53.9553752535497,
                                                  'old_value': 57.738435179897195},
                        ...
3

Bằng cách chuyển sang

$ deep diff google_store_bounce_rate_2017_04.csv 
google_store_bounce_rate_2017_07.csv --group-by source
--exclude-regex-paths total_visits --exclude-regex-paths total_no_of_bounces
8, chúng tôi đang chuyển sang “ký hiệu khoa học”. Và bằng cách đặt
$ deep diff google_store_bounce_rate_2017_04.csv 
google_store_bounce_rate_2017_07.csv --group-by source
--exclude-regex-paths total_visits --exclude-regex-paths total_no_of_bounces
9, chúng tôi đang xóa 43. 265798602382986 so với. 43. 71677762295505 từ các kết quả khác

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source --significant-digits 0 --number-format-notation e 
--exclude-regex-paths total_visits --exclude-regex-paths total_no_of_bounces

{ 'dictionary_item_added': [root['sites.google.com'], root['dfa'], root['facebook.com']],
  'dictionary_item_removed': [root['reddit.com'], root['t.co'], root['yahoo']],
  'values_changed': { "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                      "root['google.com']['']": { 'new_value': 6,
                                                  'old_value': 7},
                      "root['google.com']['bounce_rate']": { 'new_value': 49.72826086956522,
                                                             'old_value': 43.90243902439025},
                      "root['m.facebook.com']['']": { 'new_value': 5,
                                                      'old_value': 6}}}

Bây giờ chúng ta đã biết cách phân biệt các tệp để nhận được kết quả mình cần, hãy tự hỏi mình những câu hỏi thú vị tiếp theo. Những tháng nào giống nhau nhất?

DeepDiff cung cấp giải pháp cho câu hỏi này thông qua Khoảng cách sâu

Khoảng cách sâu là khoảng cách giữa 2 đối tượng. Nó là một số dấu phẩy động giữa 0 và 1. Khoảng cách sâu trong khái niệm được lấy cảm hứng từ Levenshtein Chỉnh sửa khoảng cách

Về cốt lõi, Khoảng cách sâu là số thao tác cần thiết để chuyển đổi một đối tượng này sang đối tượng khác chia cho tổng kích thước của 2 đối tượng được giới hạn ở mức 1. Lưu ý rằng không giống như Khoảng cách Levenshtein, Khoảng cách sâu dựa trên số lượng thao tác chứ KHÔNG phải số lượng thao tác “tối thiểu” để chuyển đổi một đối tượng sang đối tượng khác. Con số phụ thuộc nhiều vào mức độ chi tiết của kết quả khác. Và độ chi tiết được kiểm soát bởi các tham số được truyền cho DeepDiff

Dòng lệnh

{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...
8 mang lại cho bạn khoảng cách sâu khi bạn vượt qua cờ
{ 'dictionary_item_added': [root['dfa'], root['facebook.com'], root['sites.google.com']],
  'dictionary_item_removed': [root['t.co'], root['reddit.com'], root['yahoo']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                            ...
1. Ví dụ: hãy lấy khoảng cách sâu giữa tháng 4 và tháng 7

{ 'values_changed': { "root[0]['bounce_rate']": { 'new_value': 51.55729166666667,
                                                  'old_value': 46.51783094609373},
                      "root[0]['source']": { 'new_value': 'google',
                                             'old_value': '(direct)'},
                      "root[0]['total_no_of_bounces']": { 'new_value': 19798.0,
                                                          'old_value': 17440.0},
                      "root[0]['total_visits']": { 'new_value': 38400,
                                                   'old_value': 37491},
                      "root[1]['bounce_rate']": { 'new_value': 43.265798602382986,
                                                  'old_value': 52.884508297137764},
                      "root[1]['source']": { 'new_value': '(direct)',
                                             'old_value': 'google'},
                      "root[1]['total_no_of_bounces']": { 'new_value': 8606.0,
                                                          'old_value': 9497.0},
                      "root[1]['total_visits']": { 'new_value': 19891,
                                                   'old_value': 17958},
                      "root[2]['bounce_rate']": { 'new_value': 66.72964887419303,
                                                  'old_value': 67.13819368879217},
                      "root[2]['total_no_of_bounces']": { 'new_value': 4238.0,
                                                          'old_value': 1234.0},
                      "root[2]['total_visits']": { 'new_value': 6351,
                                                   'old_value': 1838},
                      "root[3]['bounce_rate']": { 'new_value': 53.9553752535497,
                                                  'old_value': 57.738435179897195},
                        ...
6

{ 'values_changed': { "root[0]['bounce_rate']": { 'new_value': 51.55729166666667,
                                                  'old_value': 46.51783094609373},
                      "root[0]['source']": { 'new_value': 'google',
                                             'old_value': '(direct)'},
                      "root[0]['total_no_of_bounces']": { 'new_value': 19798.0,
                                                          'old_value': 17440.0},
                      "root[0]['total_visits']": { 'new_value': 38400,
                                                   'old_value': 37491},
                      "root[1]['bounce_rate']": { 'new_value': 43.265798602382986,
                                                  'old_value': 52.884508297137764},
                      "root[1]['source']": { 'new_value': '(direct)',
                                             'old_value': 'google'},
                      "root[1]['total_no_of_bounces']": { 'new_value': 8606.0,
                                                          'old_value': 9497.0},
                      "root[1]['total_visits']": { 'new_value': 19891,
                                                   'old_value': 17958},
                      "root[2]['bounce_rate']": { 'new_value': 66.72964887419303,
                                                  'old_value': 67.13819368879217},
                      "root[2]['total_no_of_bounces']": { 'new_value': 4238.0,
                                                          'old_value': 1234.0},
                      "root[2]['total_visits']": { 'new_value': 6351,
                                                   'old_value': 1838},
                      "root[3]['bounce_rate']": { 'new_value': 53.9553752535497,
                                                  'old_value': 57.738435179897195},
                        ...
7

tháng 04 khoảng cách từ tháng 07 là 0. 168

Còn tháng 05 từ 07 thì sao?

{ 'values_changed': { "root[0]['bounce_rate']": { 'new_value': 51.55729166666667,
                                                  'old_value': 46.51783094609373},
                      "root[0]['source']": { 'new_value': 'google',
                                             'old_value': '(direct)'},
                      "root[0]['total_no_of_bounces']": { 'new_value': 19798.0,
                                                          'old_value': 17440.0},
                      "root[0]['total_visits']": { 'new_value': 38400,
                                                   'old_value': 37491},
                      "root[1]['bounce_rate']": { 'new_value': 43.265798602382986,
                                                  'old_value': 52.884508297137764},
                      "root[1]['source']": { 'new_value': '(direct)',
                                             'old_value': 'google'},
                      "root[1]['total_no_of_bounces']": { 'new_value': 8606.0,
                                                          'old_value': 9497.0},
                      "root[1]['total_visits']": { 'new_value': 19891,
                                                   'old_value': 17958},
                      "root[2]['bounce_rate']": { 'new_value': 66.72964887419303,
                                                  'old_value': 67.13819368879217},
                      "root[2]['total_no_of_bounces']": { 'new_value': 4238.0,
                                                          'old_value': 1234.0},
                      "root[2]['total_visits']": { 'new_value': 6351,
                                                   'old_value': 1838},
                      "root[3]['bounce_rate']": { 'new_value': 53.9553752535497,
                                                  'old_value': 57.738435179897195},
                        ...
8

{ 'values_changed': { "root[0]['bounce_rate']": { 'new_value': 51.55729166666667,
                                                  'old_value': 46.51783094609373},
                      "root[0]['source']": { 'new_value': 'google',
                                             'old_value': '(direct)'},
                      "root[0]['total_no_of_bounces']": { 'new_value': 19798.0,
                                                          'old_value': 17440.0},
                      "root[0]['total_visits']": { 'new_value': 38400,
                                                   'old_value': 37491},
                      "root[1]['bounce_rate']": { 'new_value': 43.265798602382986,
                                                  'old_value': 52.884508297137764},
                      "root[1]['source']": { 'new_value': '(direct)',
                                             'old_value': 'google'},
                      "root[1]['total_no_of_bounces']": { 'new_value': 8606.0,
                                                          'old_value': 9497.0},
                      "root[1]['total_visits']": { 'new_value': 19891,
                                                   'old_value': 17958},
                      "root[2]['bounce_rate']": { 'new_value': 66.72964887419303,
                                                  'old_value': 67.13819368879217},
                      "root[2]['total_no_of_bounces']": { 'new_value': 4238.0,
                                                          'old_value': 1234.0},
                      "root[2]['total_visits']": { 'new_value': 6351,
                                                   'old_value': 1838},
                      "root[3]['bounce_rate']": { 'new_value': 53.9553752535497,
                                                  'old_value': 57.738435179897195},
                        ...
9

tháng 05 khoảng cách từ tháng 07 là 0. 118

Và tháng 06 từ 07?

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source
0

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source
1

tháng 06 khoảng cách từ tháng 07 là 0. 084

Vì vậy, tháng giống với 07 nhất là tháng trước nó

ví dụ 2

Hãy xem một dữ liệu mẫu khác. Chúng tôi có các tệp csv sau

t1. csv

first_namelast_namezipJoeNobody90011JimmyBrown90007SaraSmith90007

t2. csv

first_namelast_namezipJoeNobody90011JimmyBrown90404SaraSmith90007

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source
2

Như bạn có thể thấy ở đây, Jimmy đã chuyển từ trung tâm thành phố LA (90007) đến Santa Monica (90404)

Hãy cùng xem t3. csv ngay bây giờ

first_namelast_namezipJoeNobody90011SaraSmith90007JimmyBrown90404

Khi chúng ta chạy lệnh diff

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source
3

Kết quả có vẻ không hữu ích lắm. Nó thực sự đã so sánh các hàng theo từng dòng

Có lẽ nếu chúng ta không quan tâm đến thứ tự của các hàng, chúng ta có thể nhận được nhiều kết quả hữu ích hơn?

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source
4

Lặp lại và bỏ qua thứ tự

Ở đây chúng tôi có một dòng lặp lại trong t4. csv

first_namelast_namezipJoeNobody90011JimmyBrown90404SaraSmith90007JimmyBrown90404

Lưu ý rằng việc lặp lại sẽ không biến nó thành kết quả khác khi vượt qua

{ 'dictionary_item_added': [root['dfa'], root['facebook.com'], root['sites.google.com']],
  'dictionary_item_removed': [root['t.co'], root['reddit.com'], root['yahoo']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                            ...
2

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source
5

DeepDiff cho phép bạn tạo các “bản vá” giống như lệnh vá của Linux. Lưu ý rằng "bản vá" dòng lệnh chỉ là một tập hợp con của API Python của Delta của DeepDiff cung cấp

Chúng tôi tạo bản vá bằng cách chuyển

{ 'dictionary_item_added': [root['dfa'], root['facebook.com'], root['sites.google.com']],
  'dictionary_item_removed': [root['t.co'], root['reddit.com'], root['yahoo']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                            ...
4. Ngoài ra, vì chúng tôi đang bỏ qua thứ tự của các hàng, nên chúng tôi cần chuyển
{ 'dictionary_item_added': [root['dfa'], root['facebook.com'], root['sites.google.com']],
  'dictionary_item_removed': [root['t.co'], root['reddit.com'], root['yahoo']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                            ...
5 để đảm bảo rằng các lần lặp lại là một phần của kết quả "khác biệt" trong bản vá

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source
6

Hãy nhớ rằng sự khác biệt giữa 2 tệp đó là mã zip của hàng một đã thay đổi thành 90404

Ví dụ, hãy có t1new. csv

first_namelast_namezipJoeNobody90011JimmyBrown90007SaraSmith90007JohnDoe90001MaxFoo23232

Hãy tạo thêm một tệp vá

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source
7

Vì vậy chúng tôi có

  1. patch1 là delta của t1. csv và t4. csv
  2. patch2 là delta của t1. csv và t1new. csv

Áp dụng các bản vá lỗi

Lệnh này có giao diện rất giống với lệnh

{ 'dictionary_item_added': [root['dfa'], root['facebook.com'], root['sites.google.com']],
  'dictionary_item_removed': [root['t.co'], root['reddit.com'], root['yahoo']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                            ...
6 của Linux

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source
8

first_namelast_namezipJoeNobody90011JimmyBrown90404SaraSmith90007JohnDoe90001MaxFoo23232

Tuyệt vời, nó đã cập nhật mã zip của Jimmy thành 90404 trong t1new này. tệp csv

Chúng tôi có thể sử dụng lại cùng một tệp vá trên t1

$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source
9

t1. csv sau khi áp dụng bản vá 1. Mã zip của Jimmy trong tệp này cũng được cập nhật

first_namelast_namezipJoeNobody90011JimmyBrown90404SaraSmith90007
{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...
0

t1. csv bây giờ thực sự giống như t1new. csv

first_namelast_namezipJoeNobody90011JimmyBrown90404SaraSmith90007JohnDoe90001MaxFoo23232

Các bản vá có thể được áp dụng cho bất kỳ đối tượng nào.  

{ 'dictionary_item_added': [root['dfa'], root['facebook.com'], root['sites.google.com']],
  'dictionary_item_removed': [root['t.co'], root['reddit.com'], root['yahoo']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                            ...
7

{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...
1

Có, chúng tôi có thể vá tệp yaml này từ tệp vá mà chúng tôi đã tạo giữa 2 tệp csv

{ 'dictionary_item_added': [root['dfa'], root['facebook.com'], root['sites.google.com']],
  'dictionary_item_removed': [root['t.co'], root['reddit.com'], root['yahoo']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                            ...
8

{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...
2

Như bạn có thể thấy định dạng của tệp yaml đã thay đổi. Điều này là do DeepDiff tải tệp vào từ điển Python, sửa đổi tệp rồi ghi lại vào đĩa. Trong quá trình thao tác này, tệp sẽ mất định dạng ban đầu

{ 'dictionary_item_added': [root['dfa'], root['facebook.com'], root['sites.google.com']],
  'dictionary_item_removed': [root['t.co'], root['reddit.com'], root['yahoo']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                            ...
9

Patch2 thêm các dòng mới vào tệp yaml

{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...
3

Còn việc áp dụng cho một đối tượng python thì sao?

Như đã lưu ý, lệnh

"root['(direct)']['bounce_rate']": {
    'new_value': 43.265798602382986,
    'old_value': 43.71677762295505}
0 là giao diện dòng lệnh cho cái mà DeepDiff gọi là Delta

{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...
4

Đối tượng Delta có thể được áp dụng cho các đối tượng Python

{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...
5

Các tệp "bản vá" về cơ bản là từ điển Delta được đánh số thứ tự thông qua dưa của Python. Bạn có thể áp dụng các bản vá đó cho bất kỳ đối tượng nào. Từ các kiểu dựng sẵn của python đến các lớp tùy chỉnh, mảng Numpy và hơn thế nữa. Giao diện dòng lệnh cho phép bạn tạo và sử dụng bản vá từ các tệp csv, json, toml, yaml và pickle

Tìm kiếm một cái gì đó trong tập tin?

được sử dụng để grep thông qua các tập tin. Ví dụ: hãy tìm

"root['(direct)']['bounce_rate']": {
    'new_value': 43.265798602382986,
    'old_value': 43.71677762295505}
2 trong tệp yaml ở trên

{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...
6

Chúng tôi nhận được đường dẫn chính xác đến [các] mục có sara trong đó thay vì chỉ số dòng [s]

Cho phép bạn trích xuất các giá trị từ đường dẫn trong một tệp

{ 'dictionary_item_added': [root['facebook.com'], root['sites.google.com'], root['dfa']],
  'dictionary_item_removed': [root['t.co'], root['yahoo'], root['reddit.com']],
  'values_changed': { "root['(direct)']['bounce_rate']": { 'new_value': 43.265798602382986,
                                                           'old_value': 43.71677762295505},
                      "root['(direct)']['total_no_of_bounces']": { 'new_value': 8606.0,
                                                                   'old_value': 8471.0},
                      "root['(direct)']['total_visits']": { 'new_value': 19891,
                                                            'old_value': 19377},
                      "root['Partners']['bounce_rate']": { 'new_value': 52.348993288590606,
                                                           'old_value': 58.888076079005124},
                                                           ...
7

Phần kết luận

Giao diện dòng lệnh mới cho DeepDiff cung cấp nhiều cách dễ tiếp cận hơn để xử lý trực tiếp các tệp từ bên trong trình bao