首页 > 解决方案 > 从 json 文件访问 python 嵌套字典的最佳方法,在特定级别只有 1 个变量键

问题描述

我需要从 100 个或 1000 个 .json 文件(我不熟悉,也无法控制它们的创建)中提取一个浮点数,然后在我的代码中使用它们。缩写名称的相关摘录:

...
    "a": {
        "b": {
            "variable_name": {
                "known_key": 133.2982,
                ...

在“a”、“b”和“known_key”的同一级别上还有多个附加键。在访问文件之前,我无法知道“variable_name”是什么,并且无论如何都不需要跟踪它。我确实知道它将是该字典级别的唯一键,并且几乎可以保证它在不同的 .json 文件中不是唯一的。

使用这个答案,我能够确定我可以通过将整个字典结构重复到该点并使用来一般地访问“variable_name”键,.keys()[0]但感觉应该有更好的方法来做到这一点?

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 loop 代替上面的“需要”行,但这似乎是错误的,因为其他人查看此代码会认为我正在遍历所有键并且只保留最后一个值。

for var_key in data["a"]["b"]:
    needed = data["a"]["b"][var_key]["known_key"]

所以这让我对简化的方法特别感兴趣,[list(data["a"]["b"].keys())[0]]因为我知道该级别只有 1 个键,或者想知道我是否正在处理 .json 文件结构完全错误,因为我只需要整个文件中的 1 个值.

标签: jsonpython-3.xdictionarynested

解决方案


list(data["a"]["b"].keys())[0]可以“简化”为list(data['a']['b'])[0],但简化不大。

我猜这些 JSON 文件被格式化的原因是它variable_name要么是独一无二的,要么是变化很大的,比如用户名或时间戳,你想知道它的值。如果您能够完全更改 JSON 格式,这里有两种格式仍然可以让您访问,variable_name同时更容易获得您的浮点值:

1)

"a": {
    "b": {
        "NAME": "variable_name",
        "known_key": 133.2982,
        ...
        "another_key": 4545.234
         }
     }

您可以variable_name通过调用获取data['a']['b']['NAME'],并通过调用获取您的浮点值data['a']['b'][known_key],而无需弄清楚是什么variable_name

2)

"META": {
    "NAME": "variable_name"
    },
"DATA": {
    "a": {
        "b": {
            "known_key": 133.2982,
            ...
            "another_key": 4545.234
             }
         }
}

您可以variable_name通过调用获取data['META']['NAME'],然后通过调用再次获取您的浮点值data['a']['b'][known_key],而无需弄清楚是什么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)

推荐阅读