Python: добавьте новый словарь в файл json

#python

Вопрос:

У меня есть существующий файл json ниже, и я хочу добавить новый словарь в файл json.

 {
    "company_id": 1,
    "company_name": "Google"
    "members": [
        {
            "name": "John",
            "title": "Analyst",
            "age": "24",
        },
        {
            "name": "Dave",
            "title": "Developer",
            "age": "27",

        },
        {
            "name": "Jim",
            "title": "Manager",
            "age": "34",

        }
    ]
}
 

Я пытался

         file_data = json.load(file)
        file_data.update(new_data)
        file.seek(0)
        json.dump(file_data, file, indent=4)
 

отредактированный:

Новые данные, как показано ниже, с типом dict

 new_data = {
    "company_id": 1,
    "company_name": "Google",
    "members": [
        {
            "name": "James",
            "title": "CEO",
            "age": "50"
        }
    ]
}
 

Он добавляет новые данные в файл, но портит существующие данные. Вот результат.

 {
    "company_id": 1,
    "company_name": "Google",
    "members": [
        {
            "name": "John",
            "title": "Analyst",
            "age": "24"
        },
        {
            "name": "Dave",
            "title": "Developer",
            "age": "27"
        },
        {
            "name": "Jim",
            "title": "Manager",
            "age": "34"
        }
    ]
}{
    "company_id": 1,
    "company_name": "Google",
    "members": [
        {
            "name": "James",
            "title": "CEO",
            "age": "50"
        }
    ]
}
 

Я хочу, чтобы новый участник в той же компании был добавлен в состав участников, но он просто создает еще один json после существующего.

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

1. Каким образом это «портит существующие данные»?

2. можете ли вы показать содержимое new_data? каков ожидаемый результат?

3. Это seek(0) приводит к искажению данных, потому что текстовые файлы не подходят для обновления на месте. Закройте файл после чтения из него и снова откройте его для записи перед сбросом в него.

4. @BoarGules: Да, я понимаю. Если на самом update(new_data) деле что-то перезаписывается и становится меньше, при закрытии файла может остаться что-то.

5. Я вижу, вы обновили вопрос, чтобы показать результат, но что в new_data нем ?

Ответ №1:

Я думаю, что вам нужно закрыть файл json, прежде чем сбрасывать обновленные данные:

 with open("data.json", "r") as f:
    data = json.load(f)
    data.update(your_data)

with open("data.json", "w") as f:
    json.dump(data, f, indent=4)
 

Обновленный ответ

Вероятно, вам нужно напрямую обратиться туда, где вам нужно добавить новые данные:

 import json

new_data = {
    "company_id": 1,
    "company_name": "Google",
    "members": [
        {
            "name": "James",
            "title": "CEO",
            "age": "50"
        }
    ]
}

with open("data1.json", "r") as f:
    data = json.load(f)
    data['members']  = new_data['members'] # <-- here

with open("data1.json", "w") as f:
    json.dump(data, f)
 

Перезапись file.seek(0) открытого файла работает только в том случае, если новые данные длиннее старых. Если новые данные будут короче, вы получите беспорядок.

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

1. Это работает! Я принял ваш ответ. Спасибо!

2. Я хочу показать большой палец, но у меня нет 15 репутаций или что-то в этом роде.

Ответ №2:

Просто похоже, что вам следует добавить новых участников:

 file_data[‘members’]  = new_data[‘members’]
 

вместо того, чтобы делать обновление.

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

1. После того, как я дамп в файл, теперь у меня есть новый с добавленным участником и существующий. { «идентификатор компании»: 1, «имя компании»: «Google», «участники»: [ { «имя»: «Джон», «должность»: «Аналитик», «возраст»: «24» }, { «имя»: «Дейв», «должность»: «Разработчик», «возраст»: «27» }, { «имя»: «Джим», «должность»: «Менеджер», «возраст»: «34» } ] }

2. { «идентификатор компании»: 1, «имя компании»: «Google», «участники»: [ { «имя»: «Джон», «должность»: «Аналитик», «возраст»: «24» }, { «имя»: «Дейв», «должность»: «Разработчик», «возраст»: «27» }, { «имя»: «Джим», «должность»: «Менеджер», «возраст»: «34» }, { «имя»: «Джеймс», «должность»: «Генеральный директор», «возраст»: «50» } ] }

3. Возможно, вам также следует последовать идеям других и закрыть файл после чтения и снова открыть для записи перед записью.

4. Попробуйте получить ответ от Юрия. Похоже, он решил обе проблемы.

5. Я хочу показать большой палец, но у меня нет 15 репутаций или что-то в этом роде.

Ответ №3:

Попробуйте этот код, он работает для меня:

 your_data = {"d": 4}
with open("file.json", "r ") as file:
    data = json.load(file)
    data.update(your_data)
    file.seek(0)
    json.dump(data, file, indent=4)
 

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

1. Код операции также добавляется в файл… как ваш подход решает неясную проблему «испорченности» данных?

2. Я использовал файл json в одну строку. Если вы используете тот же пример, что и в вопросе, обновите дамп следующим образом : json.dump(data, file, indent=4)

Ответ №4:

попробуйте это

 file_data.append(your_data)
 

это должно добавить 1 дикт в json, предполагая, что вы пытаетесь добавить только 1