Python基于输入修改JSON文件
我有一个JSON配置文件,看起来像这样:Python基于输入修改JSON文件,python,json,Python,Json,我有一个JSON配置文件,看起来像这样: { "generic": { "loglevel": 2, ... }, "clients": [ { "type": "foo", "bar": { "bar_1": 0.7, "bar_2": 0.95 }, ...
{
"generic": {
"loglevel": 2,
...
},
"clients": [
{
"type": "foo",
"bar": {
"bar_1": 0.7,
"bar_2": 0.95
},
...
},
{
"type": "foo",
...
}
]
}
我可以使用以下方法修改内容并存储修改后的版本:
import json
with open("sample.cfg", "r") as config_file:
config = json.load(config_file)
config["clients"][0]["bar"]["bar_1"] = 100
with open("modified.cfg", "w") as config_file:
config_file.write(json.dumps(config))
但是我想根据一些输入修改文件。假设输入是一个字符串changestring
:
changestring = 'clients,0,bar,bar_1:1,2,3'
keyval=changestring.split(':')
keys = keyval[0].split(',')
vals = keyval[1].split(',')
但是现在我不知道如何使用这些键来访问
config
路径。这真的是正确的方法吗?或者有不同的处理方法?谢谢。如果我对你的问题解释正确的话
您的键和VAL
列表如下所示
keys = ["clients", "0", "bar", "bar_1"]
vals = ["1", "2", "3"]
因此,要更新config[“clients”][0][“bar”][“bar_1”]
的值,您可以这样做
config[keys[0]][keys[1]][keys[2]][keys[3]] = vals[index]
index
将是VAL列表中的值索引,您想用它更新json这当然是一个可行的解决方案。它可以工作,但是如果实际用户提供更改字符串,您可能需要某种方法来确保该字符串有效
您可能还想区分整数索引和字符串索引
假设使用代码,可以执行以下操作:
import json
with open("sample.cfg", "r") as config_file:
config = json.load(config_file)
changestring = 'clients,0,bar,bar_1:1,2,3'
keyval = changestring.split(':')
keys = keyval[0].split(',')
vals = keyval[1].split(',')
# Move our "pointer"
obj = config
for key in keys[:-1]:
try: obj = obj[key]
except TypeError:
# Probably want a more general solution
obj = obj[int(key)]
# Update value
obj[keys[-1]] = vals
with open("modified.cfg", "w") as config_file:
config_file.write(json.dumps(config))
Python有别名,因此通过在“索引”树下更新变量(但不是一直更新),我们可以得到实际需要修改的变量的可变副本。这适用于提供的任何“深度”键。我在
python2.7
上对此进行了测试,正确的方法是将JSON文件加载到字典中,进行修改,并将其作为JSON写回文件,但您已经知道这一点。为什么要直接修改该文件?这是一个配置文件。我想在一些应用程序上运行参数扫描。这将在Oracle网格引擎上运行,因此我想将参数重新分配到不同的作业。