【问题标题】:How do I delete a key and its nested key value pairs in a json file? [duplicate]如何删除 json 文件中的键及其嵌套键值对? [复制]
【发布时间】:2019-10-17 04:13:29
【问题描述】:

我希望能够检查 json 文件是否具有我要查找的顶级键并删除该嵌套字典。

Json 文件:

{
    "One": {
        "action": "One",
        "delay": 1559243024.3665395,
        "seconds": 0,
        "score": 0,
        "delta": 1559183024.3665395,
        "grace_sec": 60000
    },
    "Two": {
        "action": "Two",
        "delay": 1559321009.969849,
        "seconds": 0,
        "score": 14,
        "delta": 1559261009.969849,
        "grace_sec": 60000
    },
    "Three": {
        "action": "Three",
        "delay": 1559909745.5981774,
        "seconds": 0,
        "score": 0,
        "delta": 1559309745.5981774,
        "grace_sec": 600000
    },
    "Four": {
        "action": "Four",
        "delay": 1559909757.0363235,
        "seconds": 0,
        "score": 1,
        "delta": 1559309757.0363235,
        "grace_sec": 600000
    }
}

这是我尝试过但没有奏效的方法:

if name == child.text:
              ...
                with open("streak.json", "r+") as f:
                    data = json.load(f)

                for x in data:
                    if name in x:
                        del x[name]

                with open("streak.json", "w") as file:
                    data = json.dump(data, file)

例如,如果 name == "Two",那么 Two 的所有键值对都将被删除,包括 Two 本身。

【问题讨论】:

  • 所以你想删除"Two": { "action": "Two", "delay": 1559321009.969849, "seconds": 0, "score": 14, "delta": 1559261009.969849, "grace_sec": 60000 },
  • 不是两个,我想删除,而是程序说的任何字典 == child.text。我只是以两个为例。

标签: python json


【解决方案1】:

只需删除顶层项目:

with open("streak.json", "r") as f:
    data = json.load(f)

if name in data:
    del data[name]

with open("streak.json", "w") as file:
    json.dump(data, file)

【讨论】:

  • 对不起,我刚刚从 OP 复制了代码。
【解决方案2】:

您可以使用pop() 函数。此函数将从字典中删除键并返回值。如果该键不存在,它将返回一个默认值。 例如:

>>> d = {'a': 1, 'b': 2}
>>> d.pop('a', None)
1
>>> d
{'b': 2}
>>> d.pop('c', None)
>>> d
{'b': 2}
>>>

这将减轻删除时检查密钥是否存在的负担,并且您不必依赖KeyError 来检查它是否失败。 您可以检查返回值是否不是您的哨兵值,在这种情况下为None,则该密钥已成功删除。如果是 sentinel 值,则 key 不存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    相关资源
    最近更新 更多