假设我有一个JSON文件,其结构未知或可能会超时 - 我想用Python中我选择的字符串替换“REPLACE_ME”的所有值。
我发现的一切都假设我知道结构。例如,我可以使用json.load
读取JSON并浏览字典以进行替换,然后将其写回。假设我知道密钥名称,结构等。
如何用其他东西替换JSON文件中的所有给定字符串值?
答案 0 :(得分:2)
那取决于,如果你想把所有名为“REPLACE_ME”的字符串放在同一个字符串中,你可以使用它。 for循环遍历字典中的所有键,然后您可以使用键来选择字典中的每个值。如果它等于你的替换字符串,它将用你想要的字符串替换它。
search_string = "REPLACE_ME"
replacement = "SOME STRING"
test = {"test1":"REPLACE_ME", "test2":"REPLACE_ME", "test3":"REPLACE_ME", "test4":"REPLACE_ME","test5":{"test6":"REPLACE_ME"}}
def replace_nested(test):
for key in test.keys():
if type(test[key]) is dict:
replace_nested(test[key])
else:
if test[key]==search_string:
test[key] = replacement
replace_nested(test)
print(test)
答案 1 :(得分:2)
你可以将JSON文件加载到字典中并通过它来递归以找到正确的值 但是 这是不必要的肌肉挠曲。
最好的方法是简单地将文件视为字符串并以这种方式进行替换。
json_file = 'my_file.json'
with open(json_file) as f:
file_data = f.read()
file_data = file_data.replace('REPLACE_ME', 'new string')
<...>
with open(json_file, 'w') as f:
f.write(file_data)
json_data = json.loads(file_data)
从此处可以重写该文件,您可以继续使用json_data
作为词典。
答案 2 :(得分:1)
为什么不直接修改文件而不是将其视为JSON?
with open('filepath') as f:
lines = f.readlines()
for line in lines:
line = line.replace('REPLACE_ME', 'whatever')
with open('filepath_new', 'a') as f:
f.write(line)
答案 3 :(得分:1)
我认为如果你想替换用引号括起来的任何键或值都没有大的风险(因为引号在json中被转义,除非它们是字符串分隔符的一部分)。
我会转储结构,执行str.replace
(带双引号),然后再次解析:
import json
d = { 'foo': {'bar' : 'hello'}}
d = json.loads(json.dumps(d).replace('"hello"','"hi"'))
print(d)
结果:
{'foo': {'bar': 'hi'}}
我没有冒险在没有引号的情况下替换部分字符串或字符串,因为它可能会更改文件的其他部分。我想不出一个例子,在没有双引号的情况下替换字符串会改变别的东西。
有一些“干净”的解决方案,比如从Replace value in JSON file for key which can be nested by n levels进行调整,但值得努力吗?取决于您的要求。
答案 4 :(得分:1)
此函数以递归方式将值original
的所有字符串替换为值new
。
这个函数适用于python结构 - 当然你可以在json文件上使用它 - 使用json.load
它不会替换词典中的键 - 只是值。
def nested_replace( structure, original, new ):
if type(structure) == list:
return [nested_replace( item, original, new) for item in structure]
if type(structure) == dict:
return {key : nested_replace(value, original, new)
for key, value in structure.items() }
if structure == original:
return new
else:
return structure
d = [ 'replace', {'key1': 'replace', 'key2': ['replace', 'don\'t replace'] } ]
new_d = nested_replace(d, 'replace', 'now replaced')
print(new_d)
['now replaced', {'key1': 'now replaced', 'key2': ['now replaced', "don't replace"]}]
答案 5 :(得分:0)
为了以动态方式解决此问题,我获得了使用相同的json文件声明要替换的变量的方法。
Json文件:
{
"properties": {
"property_1": "value1",
"property_2": "value2"
},
"json_file_content": {
"key_to_find": "{{property_1}} is my value"
"dict1":{
"key_to_find": "{{property_2}} is my other value"
}
}
Python代码(引用Replace value in JSON file for key which can be nested by n levels):
import json
def fixup(self, a_dict:dict, k:str, subst_dict:dict) -> dict:
"""
function inspired by another answers linked below
"""
for key in a_dict.keys():
if key == k:
for s_k, s_v in subst_dict.items():
a_dict[key] = a_dict[key].replace("{{"+s_k+"}}",s_v)
elif type(a_dict[key]) is dict:
fixup(a_dict[key], k, subst_dict)
# ...
file_path = "my/file/path"
if path.exists(file_path):
with open(file_path, 'rt') as f:
json_dict = json.load(f)
fixup(json_dict ["json_file_content"],"key_to_find",json_dict ["properties"])
print(json_dict) # json with variables resolved
else:
print("file not found")
希望有帮助