Как удалить элемент из .json файла?
Имеется .json - файл в виде:
{
"personal": [
{
"name": "Вася",
"salary": 5000
},
{
"name": "Саша",
"salary": 6000
}
]
}
Подскажите, пожалуйста, каким образом можно удалить элемент из этого файла по ключу в Python? Спасибо!
Ответы (3 шт):
Автор решения: Dmitry
→ Ссылка
Из вопроса не очень понятно, что вы пытаетесь удалить. Вот пример как удалить из первого элемента salary
import json
a = '''{
"personal": [
{
"name": "Вася",
"salary": 5000
},
{
"name": "Саша",
"salary": 6000
}
]}'''
dict_ = json.loads(a)
dict_["personal"][0].pop("salary")
print(dict_)
Что на выходе
{'personal': [{'name': 'Вася'}, {'name': 'Саша', 'salary': 6000}]}
При работе с файлом
import json
with open("test.json", encoding="utf8") as file:
dict_ = json.load(file)
dict_["personal"][0].pop("salary")
with open("test.json", "w", encoding="utf8") as file:
json.dump(dict_, file, ensure_ascii=False)
Автор решения: Oleksiy Lavrynenko
→ Ссылка
Спасибо всем за комментарии. Нашел следующий вариант (так как непонятно было, нужно ли удалять первый или какой-то неопределенный элемент .json - файла):
user_for_del = str(input('Введите имя удаляемого сотрудника\n'))
print(user_for_del)
with open('personal.json', 'r', encoding='utf-8') as f: # открыли файл
data = json.load(f) # загнали все из файла в переменную
minimal = 0
for txt in data['personal']:
print('Запись №:', minimal)
print(txt['name'], ':', txt['salary'])
if txt['name'] == user_for_del:
print('Запись будет удалена')
data['personal'].pop(minimal)
else:
None
minimal = minimal + 1
print('Итоговый результат: ')
print(data)
print('А теперь записываем итоговый файл')
with open('personal.json', 'w', encoding='utf8') as outfile:
json.dump(data, outfile, ensure_ascii=False, indent=2)
Благодаря этой конструкции можно шерстить .json - файл, находить нужные записи и удалять ... не думаю, что изобрел велосипед, но все же :)
Автор решения: Namerek
→ Ссылка
import json
a = """{
"personal": [
{
"name": "Вася",
"salary": 5000
},
{
"name": "Саша",
"salary": 6000
}
]}"""
def to_fire_employee(fired_employee_name: str):
data = json.loads(a)
data['personal'] = list(
filter(
lambda x: x.get('name') != fired_employee_name,
data.get('personal', [])
)
)
return json.dumps(data, ensure_ascii=False)
print(
to_fire_employee('Вася')
)
# {"personal": [{"name": "Саша", "salary": 6000}]}
Или можно "увольнять" списком:
def to_fire_employee(fired_employee_list: list):
data = json.loads(a)
data['personal'] = list(
filter(
lambda x: x.get('name') not in fired_employee_list,
data.get('personal', [])
)
)
return json.dumps(data, ensure_ascii=False)
print(
to_fire_employee(['Вася'])
)
Можно скомбинировать 2 вышеописанных варианта
from typing import Union
import json
def to_fire_employee(fired: Union[list, str]):
if isinstance(fired, list):
ff = lambda x: x.get('name') not in fired
else:
ff = lambda x: x.get('name') != fired
data = json.loads(a)
data['personal'] = list(
filter(
ff,
data.get('personal', [])
)
)
return json.dumps(data, ensure_ascii=False)
print(
to_fire_employee('Вася')
)