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ệnchữ 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
3Hã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},
...
1Hà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ácchữ 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},
...
3Bằ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},
...
7thá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},
...
9thá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
1thá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_namezipJoeNobody90011JimmyBrown90007SaraSmith90007t2. csv
first_namelast_namezipJoeNobody90011JimmyBrown90404SaraSmith90007$ deep diff google_store_bounce_rate_2017_04.csv google_store_bounce_rate_2017_07.csv
--group-by source
2Như 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_namezipJoeNobody90011SaraSmith90007JimmyBrown90404Khi 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
3Kế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
4Lặ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_namezipJoeNobody90011JimmyBrown90404SaraSmith90007JimmyBrown90404Lư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
5Vá
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
6Hã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_namezipJoeNobody90011JimmyBrown90007SaraSmith90007JohnDoe90001MaxFoo23232Hã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
7Vì vậy chúng tôi có
- patch1 là delta của t1. csv và t4. csv
- 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
8first_namelast_namezipJoeNobody90011JimmyBrown90404SaraSmith90007JohnDoe90001MaxFoo23232Tuyệ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
9t1. 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},
...
0t1. csv bây giờ thực sự giống như t1new. csv
first_namelast_namezipJoeNobody90011JimmyBrown90404SaraSmith90007JohnDoe90001MaxFoo23232Cá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},
...
1Có, 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},
...
2Như 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},
...
9Patch2 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},
...
3Cò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},
...
5Cá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},
...
6Chú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},
...
7Phầ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