Задать вопрос
@IvanIvanIvanZ

Python and json не правильно формирует базу, как починить?

Пытаюсь записывать пользователей которые посетили моего бота. С помощью json хочу их записывать и если есть дубликат то удалять соответственно. Проблема вот в чем, при изменение буквы в
with open(file, "a", encoding="utf-8") as file_name
: вот в этой строчке. Где чтение запись и т.д При "w" он чистит прошлые записи, если вдруг бот упадет, то данные потеряются соответственно. А если я ставлю "а", то он мне каждый раз создает заново словарь(список), а не добавляет в существующий.
id = {
    "ID": [],
    "Login":[]
}

    def write_inf(id, file):
        id = json.dumps(id)
        id = json.loads(str(id))

        with open(file, "a", encoding="utf-8") as file_name:
            json.dump(id, file_name, indent=4)
   
    id["ID"].append(message.chat.id)
    id["Login"].append(message.chat.username)

    id["ID"] = list(dict.fromkeys(id["ID"]))
    id["Login"] = list(dict.fromkeys(id["Login"]))

    print(id["ID"])
    print(id["Login"]) 

    write_inf(id, "exem.json")

А он либо стирает данные и корректно записывает либо делает так:
{
    "ID": [
        6551101845
    ],
    "Login": [
        "gameday_man"
    ]
}{
    "ID": [
        6551101845
    ],
    "Login": [
        "gameday_man"
    ]
}

А я хочу что бы он записывал новые данные в этот же словарь, а не каждый раз создавал новый.
  • Вопрос задан
  • 154 просмотра
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 3
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Используйте базу данных. Например SQLite а не выдумывайте свои костыли
Ответ написан
SoreMix
@SoreMix Куратор тега Python
yellow
Всё правильно. JSON не умеет работать с режимом append так, как хотите вы.

1. Читаете файл с флагом "r" допустим в переменную data через data = json.load(f)
2. В data вставляете/обновляете всё что вам нужно
3. Записываете файл в режиме "w" через json.dump(obj, fp)
Ответ написан
AshBlade
@AshBlade
Просто хочу быть счастливым
Файл нужно открывать не в режиме дозаписи ('a'), а в режиме записи ('w')

with open(file, "w", encoding="utf-8") as file_name:
    json.dump(id, file_name, indent=4)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы