【问题标题】:best way to access python nested dictionary from json file with only 1 variable key at specific level从 json 文件访问 python 嵌套字典的最佳方法,在特定级别只有 1 个变量键
【发布时间】:2019-08-14 22:04:01
【问题描述】:

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

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

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

using this answer 我能够确定我可以通过重复整个字典结构并使用.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 loop 替换为上面的“需要”行,但这似乎是错误的,因为其他人查看此代码会认为我正在遍历所有键并且只保留最后一个值.

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

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

【问题讨论】:

    标签: json python-3.x dictionary nested


    【解决方案1】:

    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
             }
         }
    

    您可以通过调用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] 再次获得您的浮点值,而无需弄清楚variable_name 是什么。

    如果无法更改格式,能否更改 JSON 文件名?因为那时你可以让每个文件名都是json_file.variable_name.json,所以你的variable_name被编码在文件名中。然后访问data['a']['b']['variable_name']like:

    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)
    

    【讨论】:

    • 不幸的是,json 文件不会改变,并且拥有 variable_named 键是正确的,因为程序可以在该级别有多个键,但我知道根据我给程序的输入会有只有 1 把钥匙。此外,知道我给出的输入并不能告诉我 variable_key 将是什么,因此也不能使用该信息。感谢您了解不需要来自 python2 的.keys() 保留
    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 2018-12-06
    • 2017-01-20
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多