Python 更新字典在列表或附加(如果不存在)中



我正在尝试更新现有的 json 文件,该文件在 python3 中具有字典列表

.
.
"guests": [
{
"name": "name1",
"package": {
"age": "30",
"dob": "Oct 10",
"image": "name1.img",
"address": "xxx"
}
},
{
"name": "name2",
"package": {
"age": "20",
"dob": "Oct 10",
"image": "name2.img",
"address": "xxx"
}
}
]
.
.

我想用新数据更新每个客人数据,如果客人 (name( 不存在,则将客人数据作为新客人附加到列表中。

如何在 Python 中实现这一点?

您可以使用in运算符检查字典中是否存在某个键。

new_guests = []
for guest in guests:
if 'name' not in guest:
# append new information
new_info = {}
new_info['name'] = "your_new_name"
new_info['package'] = {}  # new info
else:
# update with new information
guest['package'].update({})

data包含示例数据列表。data_new是您要检查它是否存在的数据。 如果名称存在,则它正在更新data列表并设置一个已更新的标志。如果它不存在,则它不会设置标志,以便将新数据追加到列表中。

数据列表

data = { "guests": [
{
"name": "name1",
"package": {
"age": "30",
"dob": "Oct 10",
"image": "name1.img",
"address": "xxx"
}
},
{
"name": "name2",
"package": {
"age": "20",
"dob": "Oct 10",
"image": "name2.img",
"address": "xxx"
}
}
] }

查询数据

guest_new = {
"name": "name3",
"package": {
"age": "21",
"dob": "Nov 11",
"image": "name3.img",
"address": "xxxxxxxxxx"
}
}
guest_flag = 0

如果存在,则更新或追加

for i in range (0, len(data["guests"])):
if(data['guests'][i]['name'] == guest_new['name']):
data['guests'][i]['package'] = guest_new['package']
guest_flag = 1
if(guest_flag == 0):    
data['guests'].append(guest_new)

要更新 json 文件,首先需要将其加载到字典中。然后更新字典。最后,将更新的字典转储回 json 文件。 关于更新来宾对象列表,我宁愿以名称为键构建来宾字典(根据问题描述,预计名称是唯一的(以简化更新路由。

import json
# list of new guests
new_guests = [
{
"name": "name1",
"package": {
"age": "300",
"dob": "Jan 1",
"image": "new_name1.img",
"address": "yyy"
}
},
{
"name": "name3",
"package": {
"age": "40",
"dob": "Oct 4",
"image": "name3.img",
"address": "zzz"
}
}
]
# path to your json file
path_to_json = 'path/to/data.json'
# load json to dict
with open(path_to_json) as f:
data = json.load(f)
# build dict of json guest using name as key
guests = {x['name']: x for x in data['guests']}
# update guests
for g in new_guests:
guests[g['name']] = g
# update data and dump it to the file
data['guests'] = [guests[name] for name in guests]
with open(path_to_json, 'w') as f:
json.dump(data, f)

相关内容

最新更新