Python基于输入修改JSON文件

Python基于输入修改JSON文件,python,json,Python,Json,我有一个JSON配置文件,看起来像这样: { "generic": { "loglevel": 2, ... }, "clients": [ { "type": "foo", "bar": { "bar_1": 0.7, "bar_2": 0.95 }, ...

我有一个JSON配置文件,看起来像这样:

{
    "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网格引擎上运行,因此我想将参数重新分配到不同的作业。