Python сравни два файла JSON и получить только разницу - PullRequest
0 голосов
/ 25 января 2019

Я хочу сравнить два файла json и получить только разницу между ними.

У меня есть код, который может сравнивать два файла json, но он дает мне строку, которая совпадает, и я хочу толькоразница.

+     "AAAA": {
+       "name": "toto",
+       "age": null
+     },
      "BBBB": {
        "name": "tete",
        "age": 26
      },
-     "CCCC": {
?               ^ ^ ^^^
+     "DDDD": {
?               ^ ^ ^^^
-       "name": "tete",
?                   ^^^      ^
+       "age": "45",


with open('orig.json') as orig_file, open('target.json') as target_file:
    diff = difflib.Differ()
    result = diff.compare(target_file.readlines(),    orig_file.readlines())
    print("### JSON DIFF ###")
    print(''.join(result))

Я не хочу сохранять, если значение ключа одинаково, но если значение ключа отличается, я хочу сохранить ключ.

Для экземпляраЯ не хочу оставлять ключ "BBBB", потому что он совпадает между двумя файлами, и другой ключ, который я хочу сохранить, потому что значение отличается

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вы можете применить ответ julienc - который является "технически правильным", учитывая формулировку вашего вопроса - но выполнение различий в тексте по строкам json не работает - существует много разных допустимых представлений json для одних и тех же данных из-за несущественные пробелы / отступы, а также тот факт, что объекты json определены как неупорядоченные коллекции (поэтому {"foo":42, "bar":true} и {"bar": true, "foo":42} отличаются друг от друга по тексту, но строго равны после не сериализации.

Итак, рабочее решение - десериализовать ваши данные json и провести правильное сравнение.

0 голосов
/ 25 января 2019

В соответствии с документацией :

Каждая строка разницы Различий начинается с двухбуквенного кода:

| Code | Meaning                                   |
|------|-------------------------------------------|
| '- ' | line unique to sequence 1                 |
| '+ ' | line unique to sequence 2                 |
| '  ' | line common to both sequences             |
| '? ' | line not present in either input sequence |

Итакв общем, все, что вам нужно сделать, это отфильтровать строки, начинающиеся с "- " или "+ ".

result = diff.compare(target_file.readlines(), orig_file.readlines())
result = [line for line in result if line.startswith(("- ", "+ "))]
...