#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