Сравните два файла JSON и верните разницу

#python #json #file #comparison

Вопрос:

Я нашел несколько подобных вопросов на этот счет. Проблема в том, что ни одно из этих решений не работает для меня, а некоторые из них слишком продвинуты. Я пытаюсь прочитать два файла JSON и вернуть разницу между ними.

Я хочу иметь возможность вернуть отсутствующий объект из файла 2 и записать его в файл 1.

Это оба файла JSON

 file1

[
 {
    "name": "John Wood",
    "age": 35,
    "country": "USA"
 },
 {
    "name": "Mark Smith",
    "age": 30,
    "country": "USA"
 }
]
 

.

 file2

[
 {
    "name": "John Wood",
    "age": 35,
    "country": "USA"
 },
 {
    "name": "Mark Smith",
    "age": 30,
    "country": "USA"
 },
 {
    "name": "Oscar Bernard",
    "age": 25,
    "country": "Australia"
 }
]
 

Код

 with open("file1.json", "r") as f1:
    file1 = f1.read()
    item1 = json.loads(file1)
    print(item1)

with open("file2.json", "r") as f2:
    file2 = f2.read()
    item2 = json.loads(file2)
    print(item2)

# Returns if that index is the same
for v in range(len(item1)):
    for m in range(len(item2)):
        if item2[v]["name"] == item1[m]["name"]:
            print("Equal")
        else:
            print("Not Equal")
 

Я не привык программировать с помощью JSON или сравнивать два разных файла.
Я хотел бы помочь вернуть разницу и в основном скопировать и вставить
отсутствующий объект в файл1. То, что у меня здесь, показывает мне, равен ли каждый объект в
файле 1 файлу 2 или нет. Таким образом, возвращая вывод «Равно» и «Не равно».

Выход:

 Equal
Not Equal
Not Equal
Not Equal
Equal
Not Equal
 

Я хочу вернуть, если файл1 не равен файлу 2 и какой объект («имя»)
это тот, кого не хватает. После этого я хочу иметь возможность добавить/скопировать этот отсутствующий объект в файл 2, используя с помощью open(«file2.json», «w»).

Комментарии:

1. Пожалуйста, исправьте свой отступ.

2. Что вы будете делать, если разница между двумя файлами будет более сложной, чем это?

3. Я действительно думал об этом вопросе. Вот почему я пытаюсь работать с этими простыми файлами JSON.

Ответ №1:

 with open("file1.json", "r") as f1:
    file1 = json.loads(f1.read())
with open("file2.json", "r") as f2:
    file2 = json.loads(f2.read())

for item in file2:
    if item not in file1:
        print(f"Found difference: {item}")
        file1.append(item)

print(f"New file1: {file1}")
 

Комментарии:

1. Я не думал, что все так просто. Я вроде как немного усложнил свой код, но я не знал о «f» в печати. Спасибо!

2. Как бы я вернул разницу только с помощью ключа, такого как «имя»? Я попытался сделать, если элемент[‘имя’] не в файле 1: Это не сработало и просто вернет все имена из файла 2

3. для элемента в [x[‘имя’] для x в файле 2]: если элемента нет в [x[‘имя’] для x в файле 1]: печать(f»Найдено различие: {элемент}») файл1.добавить(элемент)

4. Это возвращает ошибку: TypeError: строковые индексы должны быть целыми числами

Ответ №2:

 file1=[
 {
    "name": "John Wood",
    "age": 35,
    "country": "USA"
 },
 {
    "name": "Mark Smith",
    "age": 30,
    "country": "USA"
 }
]
file2=[
 {
    "name": "John Wood",
    "age": 35,
    "country": "USA"
 },
 {
    "name": "Mark Smith",
    "age": 30,
    "country": "USA"
 },
 {
    "name": "Oscar Bernard",
    "age": 25,
    "country": "Australia"
 }
]

for item in file2:
    if item['name'] not in [x['name'] for x in file1]:
        print(f"Found difference: {item}")
        file1.append(item)

print(f"New file1: {file1}")