【问题标题】:Find difference between two json files in python在python中查找两个json文件之间的区别
【发布时间】:2019-05-06 13:49:02
【问题描述】:

我有两个 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'}}}

【问题讨论】:

  • 是的,A.json 和 B.json - 是有效的 json 文件。
  • 您可以使用https://jsonlint.com/ 进行检查。
  • @interjay 显然这些是“json-per-line”文件。
  • a_li 和 b_li 都包含相同的 json 对象!也许您需要编辑您的问题@user15051990
  • 是的,Mustang 2 在 B.json 中看起来应该是 Mustang 3

标签: python json python-3.x


【解决方案1】:

jsondiff 没有做你(可能)想要做的事情。
如果AB 列表不一定相同Numberbrand

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'}}]

【讨论】:

  • 我收到错误 `r = dict(b)`ValueError: dictionary update sequence element #0 has length 1; 2 is required。当我运行这段代码时:A = open(path1)B = open(path2)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)`
  • 我只能猜测。在我的代码中,AB 是字典列表,而您的 ABTextwIOWrapperdict 正在解析代码中的字符串)。使用import json 模块并改用A = json.load(open(path1))
  • 我使用了A = json.load(open(path1)),现在我得到了json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 119)
  • 这可能意味着您的文件不是格式正确的 json。发布您的文件示例
  • 已更新,结帐 B.json。
【解决方案2】:

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)

可能有一个标准库可以处理这种事情。但这就是你想要的逻辑。

【讨论】:

  • 我正在尝试获取 B.json(模型)中存在的密钥,但不在 A.json 中。这应该与Numberbrand 分组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2014-06-02
相关资源
最近更新 更多