我必须执行一些测试才能调整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
}
]
]
}
]
}
}
]
}
]
}
}
答案 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
。