Я хочу иметь возможность проверить, есть ли в файле 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)
Так, например, если имя == "Two", то все пары значений ключа Two будут удалены, включая саму Two.
Это не Два, я хочу удалить а любой словарь, который программа говорит == child.text. Я просто использовал Two в качестве примера.






Просто удалите элемент верхнего уровня:
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)
Извините, я просто скопировал код из ОП.
Вы можете использовать функцию pop(). Эта функция удалит ключ из словаря и вернет значение. Если ключ не существует, он вернет значение по умолчанию.
например:
>>> d = {'a': 1, 'b': 2}
>>> d.pop('a', None)
1
>>> d
{'b': 2}
>>> d.pop('c', None)
>>> d
{'b': 2}
>>>
Это уменьшит нагрузку на проверку существования ключа при удалении, и вам не придется полагаться на KeyError, чтобы проверить, не произошел ли сбой.
Вы можете проверить, не является ли возвращаемое значение вашим дозорным значением, None в этом случае ключ был успешно удален. Если это сигнальное значение, то ключ никогда не существовал.
Итак, вы хотите удалить
"Two": { "action": "Two", "delay": 1559321009.969849, "seconds": 0, "score": 14, "delta": 1559261009.969849, "grace_sec": 60000 },?