![](/img/trans.png)
[英]How I find the first difference encountered between two Files in python?
[英]Find difference between two json files in python
我有兩個json文件,如下所示。 我想找到兩者之間的差異,並將差異寫入第三個json文件。 我期望應該計算json diff-(B.json-A.json)
A.json
[{
"Number": 123,
"brand": "Ford",
"model": {
"Mustang1": "2.64",
"Mustang2": "3.00",
"Mustang3": "1.00",
"Mustang4": "1.64"
}
},
{
"Number": 321,
"brand": "Toyota",
"model": {
"Camry": "2.64",
"Prius": "3.00",
"Corolla": "1.00",
"Tundra": "1.64"
}
},
{
"Number": 111,
"brand": "Honda",
"model": {
"Accord": "2.64",
"Civic": "3.00",
"Insight": "1.00",
"Pilot": "1.64"
}
},
{
"Number": 891,
"brand": "Ford",
"model": {
"Mustang1": "2.64",
"Mustang8": "3.00",
"Mustang3": "1.00",
"Mustang6": "1.64"
}
},
{
"Number": 745,
"brand": "Toyota",
"model": {
"Camry": "2.64",
"Sienna": "3.00",
"4Runner": "1.00",
"Prius": "1.64"
}
},
{
"Number": 325,
"brand": "Honda",
"model": {
"Accord": "2.64",
"Passport": "3.00",
"HR-V": "1.00",
"Pilot": "1.64"
}
},
{
"Number": 745,
"brand": "Accura",
"model": {
"TLX": "2.64",
"MDX": "3.00"
}
},
{
"Number": 325,
"brand": "Accura",
"model": {
"TLX": "2.64",
"MDX": "3.00"
}
}
]
B.json
[{
"Number": 123,
"brand": "Ford",
"model": {
"Mustang1": "2.64",
"Mustang2": "3.00",
"Mustang5": "1.64"
}
},
{
"Number": 321,
"brand": "Toyota",
"model": {
"Camry": "2.64",
"Prius1": "3.00",
"Corolla1": "1.00",
"Tundra": "1.64"
}
},
{
"Number": 111,
"brand": "Honda",
"model": {
"Accord1": "2.64",
"Civic1": "3.00",
"Insight": "1.00",
"Pilot": "1.64"
}
},
{
"Number": 891,
"brand": "Ford",
"model": {
"Mustang1": "2.64",
"Mustang8": "3.00",
"Mustang3": "1.00",
"Mustang6": "1.64"
}
},
{
"Number": 745,
"brand": "Toyota",
"model": {
"Camry2": "2.64",
"Sienna2": "3.00",
"4Runner": "1.00",
"Prius": "1.64"
}
},
{
"Number": 325,
"brand": "Honda",
"model": {
"Accord": "2.64",
"Passport2": "3.00",
"HR-V2": "1.00",
"Pilot": "1.64"
}
},
{
"Number": 745,
"brand": "Accura",
"model": {
"TLX": "2.64",
"MDX2": "3.00"
}
},
{
"Number": 325,
"brand": "Accura",
"model": {
"TLX1": "2.64",
"MDX": "3.00"
}
}
]
打印:
{0: {'model': {'$delete': ['Mustang3', 'Mustang4'],
'Mustang2': '1.00',
'Mustang5': '1.64'}},
1: {'model': {'$delete': ['Prius', 'Corolla'],
'Corolla1': '1.00',
'Prius1': '3.00'}},
2: {'model': {'$delete': ['Accord', 'Civic'],
'Accord1': '2.64',
'Civic1': '3.00'}},
4: {'model': {'$delete': ['Camry', 'Sienna'],
'Camry2': '2.64',
'Sienna2': '3.00'}},
5: {'model': {'$delete': ['Passport', 'HR-V'],
'HR-V2': '1.00',
'Passport2': '3.00'}},
6: {'model': {'$delete': ['MDX'], 'MDX2': '3.00'}},
7: {'model': {'$delete': ['TLX'], 'TLX1': '2.64'}}}
預期結果 :根據B.json-A.json計算。 它將檢查A.json中模型中所有的鍵,但B.json中不存在的鍵-按其他鍵(編號,品牌)分組。
{"Number": 123, "brand": "Ford", 'model': {'Mustang2': '1.00', 'Mustang5': '1.64'}},
{"Number": 321, "brand": "Toyota", 'model': {'Corolla1': '1.00', 'Prius1': '3.00'}},
{"Number": 111, "brand": "Honda", 'model': {'Accord1': '2.64', 'Civic1': '3.00'}},
{"Number": 745, "brand": "Toyota", 'model': {'Camry2': '2.64', 'Sienna2': '3.00'}},
{"Number": 325, "brand": "Honda", 'model': {'HR-V2': '1.00', 'Passport2': '3.00'}},
{"Number": 745, "brand": "Accura", 'model': {'MDX2': '3.00'}},
{"Number": 325, "brand": "Accura", 'model': {'TLX1': '2.64'}}}
jsondiff
不執行您(可能)嘗試執行的操作。
如果A
和B
列表的Number
和brand
不一定相同:
res = []
for b in B:
r = dict(b)
b_in_A = next((a for a in A if b["Number"] == a["Number"] and b["brand"] == a["brand"]), None)
if b_in_A:
r["model"] = {k: v for k, v in r["model"].items() if k not in b_in_A["model"]}
res.append(r)
res
輸出:
[{'Number': 123, 'brand': 'Ford', 'model': {'Mustang5': '1.64'}},
{'Number': 321,
'brand': 'Toyota',
'model': {'Corolla1': '1.00', 'Prius1': '3.00'}},
{'Number': 111,
'brand': 'Honda',
'model': {'Accord1': '2.64', 'Civic1': '3.00'}},
{'Number': 891, 'brand': 'Ford', 'model': {}},
{'Number': 745,
'brand': 'Toyota',
'model': {'Camry2': '2.64', 'Sienna2': '3.00'}},
{'Number': 325,
'brand': 'Honda',
'model': {'HR-V2': '1.00', 'Passport2': '3.00'}},
{'Number': 745, 'brand': 'Accura', 'model': {'MDX2': '3.00'}},
{'Number': 325, 'brand': 'Accura', 'model': {'TLX1': '2.64'}}]
jsondiff似乎只是與各個json對象進行比較以發現其鍵之間的差異。 您似乎正在嘗試僅獲取不在兩個列表中的json對象的列表。 這可以通過循環遍歷並檢查對象是否在兩個列表中來完成:
unique_cars = [car for car in jf if car not in jg]
for car in jg:
if car not in jf:
unique_cars.append(car)
可能有一個stdlib處理這種事情。 但這就是您想要的邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.