迭代替换json文件中的值

时间:2019-01-29 10:42:42

标签: python

我必须执行一些测试才能调整json文件的某些数字参数。 为简单起见,我将所有这些值替换为字符串“变量”,然后执行以下操作:

numeric_vals = [10,20, 30, 40]  # numeric values to replace in that order 
with open ('mypath') as my_file:
    json_str = my_file.read()
for i in numeric_vals:
    json_str = json_str.replace("\"variable\"", str(i), 1)
c = json.loads(json_str)  #loading in order to work with

这很好用,但是有更有效的方法吗?需要替换的值的深度可变,并且可能在列表等内部。我的json文件为15Kb,我需要测试很多(真的很多!)配置。在每个测试中,大约需要替换200个变量。我使用的是python 2.7,但也可以使用python 3.5。 感谢您的帮助!

编辑:

这是我的字典的一个示例。应该注意的是,真实的东西要更长,更深:

 {
"1": {
    "transition": {
        "value": "variable", # edit here
        "unite": "sec"
    },
    "sequence": [
        {
            "step": "STEP",
            "name": "abc",
            "transition": {
                "value": "variable", #edit here
                "unite": "sec"
            },
            "entity": "aa",
            "_equipement": 3,
            "_value": 0
        },
        {
            "step": "FORK",
            "BRANCHES": [
                {
                    "": {
                        "sequence": [
                            {
                                "step": "STEP",
                                "name": "klm",
                                "transition": {
                                    "value": "variable", # edit here
                                    "unite": "sec"
                                },
                                "entity": "vvv",
                                "_equipement": 10,
                                "_value": 0,
                                "conditions": [
                                    [
                                        {
                                            "name": "ddd",
                                            "type": "el",
                                            "_equipement": 7,
                                            "_value": 1
                                        }
                                    ]
                                ]
                            }
                        ]
                    }
                },
                {
                    "SP": {
                        "sequence": [
                            {
                                "step": "STEP",
                                "name": "bbb",
                                "transition": {
                                    "value": "variable", # edit here
                                    "unite": "sec"
                                },
                                "entity": "bb",
                                "_equipement": 123,
                                "_value": 0,
                                "conditions": [
                                    [
                                        {
                                            "name": "abcd",
                                            "entity": "dgf",
                                            "type": "lop",
                                            "_equipement": 7,
                                            "_valeur": 0
                                        }
                                    ]
                                ]
                            }
                        ]
                    }
                }
            ]
        }
    ]
}

}

2 个答案:

答案 0 :(得分:2)

在分层/结构化数据上执行字符串操作通常是一个坏主意,因为在许多情况下您可能会破坏结构。由于您已经解析了JSON,因此可以扩展解码器以在解析期间专门处理您的情况,例如:

node

这可确保您正确解析JSON,并且不会替换它,例如,恰好称为“变量”的键。

请注意,如果JSON中的numeric_vals = [10, 20, 30, 40] # numeric values to replace in that order SEARCH = 'variable' REPLACE = iter(numeric_vals) # turn into an iterator for sequential access def replace_values(value): return {k: next(REPLACE) if v == SEARCH else v for k, v in value.items()} with open('path/to/your.json') as f: a = json.JSONDecoder(object_hook=replace_values).decode(f.read()) 值多于StopIteration,它将引发"variable"异常-您可以在{{1 }},并在遇到此类情况时进行处理。

答案 1 :(得分:1)

通过在循环外进行对json.loads()的调用可以提高性能,您只需要在最后一次 进行一次操作即可。

numeric_vals = [10, 20, 30, 40]

with open('mypath') as my_file:
    json_str = my_file.read()
    for i in numeric_vals:
        json_str = json_str.replace('"variable"', str(i), 1)
    c = json.loads(json_str)

按照此post,相对于string.replace,更喜欢使用re.sub