Я думал, что это просто, чтобы удалить ключ из JSON вложенного dict, но я в конечном итоге с ошибками. У меня есть файл JSON, как показано ниже, и я хочу удалить ключ "8888" из его элемента "Codes".

Dummy.json :

{
    "Codes": {
        "8888": "code1|18888",
        "9999": "code2|19999",
        "7777": "code3|17777"
    },
    "Names": {
        "Site1": "Site1|18888",
        "Site2": "Site2|19999",
        "Site3": "Site3|17777"
    }
}

Код Python:

import json

with open('dummy.json') as json_data:
    data = json.load(json_data)
    for element in data["Codes"]:
        #del element['8888']
        element.pop('8888', None)

with open('dummy.json'), 'w') as outfile:  
    json.dump(data, outfile)

Результат:

Для первой попытки я попытался del element['8888'] и выдает TypeError: 'str' object does not support item deletion

В соответствии с примером, найденным здесь, я пытался с {{X0} } и выдает ошибку AttributeError: 'str' object has no attribute 'pop'.

Я не уверен, какую ошибку я совершил, пожалуйста, помогите.

2
Maria628 31 Май 2020 в 09:17

3 ответа

Лучший ответ

В цикле for element in data["Codes"] элемент будет ключом словаря data["Codes"]. Поэтому, если вывести все элементы data["Codes"], результат будет следующим.

for element in data["Codes"]:
    print(element)
>>> 8888
>>> 9999
>>> 7777

Вам не нужно для цикла. Если вы хотите удалить (или удалить) какой-то ключ data["Codes"], просто сделайте это.

data["Codes"].pop("8888", None)
0
Yongjin Jo 31 Май 2020 в 06:25

Попробуй это:

with open('test.json') as fp:
    data = json.loads(fp.read())
    del data['Codes']['8888']
1
deadshot 31 Май 2020 в 06:26

Итерируя по data["Codes"], element будет ключом словаря data["Codes"] и является строкой, которая не имеет функции pop (может применяться только для диктовок ) .

Попробуйте вместо этого:

import json
with open('dummy.json') as json_data:
    data = json.load(json_data)
    data["Codes"].pop("8888")

with open('dummy.json', 'w') as outfile:  
    json.dump(data, outfile)

2
Gabip 31 Май 2020 в 06:27