Как удалять данные из json массива?
Вообщем у меня есть массив:
В нём хранятся всякие штуки
Я использую del mas[i] Но оно не работает
Вот мой код :
with open('keys.json', 'r', encoding='utf-8') as f: #открыли файл с данными
mas = json.load(f) #загнали все, что получило
print(key)
for i in range(len(mas)):
if (mas[i] == key):
print(mas)
await bot.send_message(
chat_id=message.chat.id,
text = "okay"
)
text = 1
sql.execute(f'UPDATE users SET sub = {text} WHERE user_id = {message.from_user.id}')
int(i)
del mas[i]
else:
await bot.send_message(
chat_id=message.chat.id,
text = "не окей" )
key это данные которые ввёл вользователь
А вот и ошибка (IndexError: list index out of range)
Ответы (2 шт):
Автор решения: CrazyElf
→ Ссылка
У вас типичная ошибка - удаление элементов из списка, по которому вы итерируетесь в данный момент. Так делать нельзя, нумерация ломается - в списке остаётся меньше элементов, чем ожидается и индекс выскакивает за границу списка.
Одно из возможных решений - создавать новый список из нужных элементов, а не удалять ненужные из старого списка. И итерироваться лучше прямо по элементам списка, индекс вы больше ни для чего не используете кроме получения элемента:
new_mas = []
for item in mas:
if (item == key):
...
else:
new_mas.append(item)
...
Автор решения: RusKFA
→ Ссылка
with open('keys.json', 'r', encoding='utf-8') as f: #открыли файл с данными
mas = json.load(f) #загнали все, что получило
if key in mas:
text = 1
await bot.send_message(chat_id=message.chat.id, text = "okay")
sql.execute(f'UPDATE users SET sub = {text} WHERE user_id = {message.from_user.id}')
mas.remove(key) # удаляем ключ
with open('keys.json', 'w', encoding='utf-8') as f:
json.dump(mas, f) #сохраняем то, что получилось
else:
await bot.send_message(chat_id=message.chat.id, text = "не окей" )

