![](/img/trans.png)
[英]python - extract a specific key / value from json file by a variable
[英]best way to access python nested dictionary from json file with only 1 variable key at specific level
我需要从100或1000个.json文件(我不熟悉,并且无法控制它们的创建)中提取一个float,然后在我的代码中稍后使用它们。 简短名称的相关摘录:
...
"a": {
"b": {
"variable_name": {
"known_key": 133.2982,
...
在“ a”,“ b”和“ known_key”的同一级别上还有多个其他键。 在访问文件之前,我无法知道“ variable_name”将是什么,并且无论如何都无需对其进行跟踪。 我确实知道这将是字典该级别的唯一键,并且几乎可以保证它在不同的.json文件中不是唯一的。
使用这个答案,我能够确定我是否可以通过重复整个字典结构并使用.keys()[0]
来访问“ variable_name”键,但感觉应该有更好的方法吗?
with open("json_file_X.json", "r") as j_in:
data = json.load(j_in)
needed = data["a"]["b"][list(data["a"]["b"].keys())[0]]["known_key"]
#do downstream stuff with needed float value after closing .json file
我知道我可以将下面的2行替换为上面的“所需”行,但是这似乎是错误的,因为其他查看此代码的人会认为我正在遍历所有键并仅保留最后一个值。
for var_key in data["a"]["b"]:
needed = data["a"]["b"][var_key]["known_key"]
考虑到我知道该级别只有1个键,或者我想知道是否可以简化[list(data["a"]["b"].keys())[0]]
的方式,这使我特别感兴趣[list(data["a"]["b"].keys())[0]]
考虑到我只需要整个文件中的1个值,就完全错误了.json文件结构。
list(data["a"]["b"].keys())[0]
可以“简化”为list(data['a']['b'])[0]
,但简化。
我猜测这些JSON文件被格式化的原因是, variable_name
是唯一的或变化很大的东西,例如用户名或时间戳,并且您想知道其值。 如果您完全可以更改JSON格式 ,则以下两种格式仍然可以使您访问variable_name
同时更轻松地获取float值:
1)
"a": {
"b": {
"NAME": "variable_name",
"known_key": 133.2982,
...
"another_key": 4545.234
}
}
您可以通过调用data['a']['b']['NAME']
来获取variable_name
,并通过调用data['a']['b'][known_key]
来获取浮点值,而无需弄清楚什么是variable_name
。
2)
"META": {
"NAME": "variable_name"
},
"DATA": {
"a": {
"b": {
"known_key": 133.2982,
...
"another_key": 4545.234
}
}
}
您可以通过调用data['META']['NAME']
来获取variable_name
,然后再次通过调用data['a']['b'][known_key]
来获取float值,而无需弄清什么是variable_name
。
如果无法更改格式,可以更改JSON文件名吗? 因为那时您可以将每个文件名都设为json_file.variable_name.json
,所以您的variable_name
编码在文件名中。 然后访问data['a']['b']['variable_name']
如下所示:
for fname in ['json_file.X.json', 'json_file.Y.json', ...]:
with open(fname, "r") as j_in:
data = json.load(j_in)
var_name = fname.split('.')[1]
needed = data["a"]["b"][var_name]["known_key"]
print(fname, var_name, needed)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.