如何使用 python 更新嵌套 JSON 文件中的值?
Posted
技术标签:
【中文标题】如何使用 python 更新嵌套 JSON 文件中的值?【英文标题】:How to update a value in nested JSON file using python? 【发布时间】:2022-01-19 10:55:09 【问题描述】:我有一个名为“students.json”的 JSON 文件,如下所示:-
"students":
"1":
"name": "Ricky",
"marks":
"science": "90",
"english": "50"
,
"2":
"name": "Brad",
"marks":
"science": "80",
"english": "75"
我想将 Brad 的英语标记更新为 85。我只有 JSON 文件、标记路径列表和更新标记。
updated_marks = "85"
path_to_marks = ["students", "2", "marks", "english"]
我想做这样的事情,
import json
updated_marks = "85"
path_to_marks = ["students", "2", "marks", "english"]
with open('students.json', 'r+') as f:
json_data = json.load(f)
value = json_data
#TODO: code to update marks
f.seek(0)
f.write(json.dumps(json_data))
f.truncate()
【问题讨论】:
看看this 的回答,这几乎就是你想要做的 【参考方案1】:由于您使用 json.load
通过默认的 conversion table 将文件加载回 Python 对象,因此您应该得到一个字典。
因此,在您的情况下,您应该能够像在字典中一样正常编辑数据:
json_data["students"]["2"]["marks"]["english"] = updated_marks
编辑:
由于您想根据 path_to_english_marks 列表进行调用,您可以执行类似 here from jjp 中提到的操作。
from functools import reduce
from operator import getitem
def set_nested_item(dataDict, mapList, val):
"""Set item in nested dictionary"""
reduce(getitem, mapList[:-1], dataDict)[mapList[-1]] = val
return dataDict
key_lst = ["key1", "key2", "key3"]
value = "my_value"
d = "key1": "key2": "key3": "some_value"
d = set_nested_item(d, key_lst, value)
print(d)
# 'key1': 'key2': 'key3': 'my_value'
【讨论】:
列表中的值不是固定的,它们可以更改。例如,我可以收到-[“students”、“3”、“marks”、“science”]。在这种情况下,我必须更新第三个学生的科学分数。 好的,表示您要根据列表path_to_english_marks
操作一个值。如果结构合理,我们暂时搁置一旁。您实际上只需要将列表作为请求的键。【参考方案2】:
def update(json, path, new_value):
obj_ptr = json
for key in path:
if key == path[-1]:
obj_ptr[key] = new_value
obj_ptr = obj_ptr[key]
像这样从您的代码中调用它:
update(json_data, path_to_marks, updated_marks)
【讨论】:
【参考方案3】:直接保存
data['students']['2']['marks']['english'] = marks
【讨论】:
你好,这会设置它,但你可以包括保存部分吗?以上是关于如何使用 python 更新嵌套 JSON 文件中的值?的主要内容,如果未能解决你的问题,请参考以下文章