Подключаю базу данных к боту через файл на Python, как восстанавливать данные после переподключения?

Бот записывает на файл инфу о зарегистрированном пользователе. Затем когда я его перезапускаю, он начинает все записывать по новой. Что мне сделать, создать еще функцию на восстановление данных или я просто не использовал эту функцию в начале взаимодействия бота? Снизу скрин начало взаимодействия с ботом.


Код со всеми функциями файла:

def check(x):
    file = open('data.txt', 'r', encoding = 'utf-8')
    if str(x) in file.read():
        return 1
    else:
        return 0
    file.close()

def save_bd(users):
	lines = []
	for user in users:
		lines.append(f'"id" : {user.id}, "mode" : "{user.mode}", "money" : "{user.money}", "name" : "{user.name}"')
	lines = '\n'.join(lines)
	with open(f'{tdir(__file__)}/data.txt'.replace('\\', '/').replace('smartbot.py/', ''), 'w', encoding = 'utf-8') as file:
		file.write(lines)
		file.close()

def read_bd():
	users = []
	with open(f'{tdir(__file__)}/data.txt'.replace('\\', '/').replace('smartbot.py/', ''), 'r', encoding = 'utf-8') as file:
		lines = [x.replace('\n', '') for x in file.readlines()]
		file.close()
	for line in lines:
		line = eval('{' + line + '}')
		if line != '{}':
			users.append(User(id = line['id'], mode = line['mode'], money = line['money'], name = line['name']))
	return users

def adder(x):
    file = open('data.txt', 'a', encoding = 'utf-8')
    file.write(f'{x}\n')
    file.close()

Когда используете конструкцию with open, то не нужно делать явно close. В терминале видна ошибка - у конструктора класса User нет аргумента money, поэтому пользователи не забираются из файла.

Эта ошибка у меня выходит, если пропишу users = read_bd()
Вообщем удалил я file.close, такая же проблема, даже везде

Так надо еще исправить вторую проблему о том, что юзер не принимает такие аргументы.

image


Чтоб вы понимали, у меня сейчас такие аргументы стоят, в init я писал эти аргументы, также ошибка, убирал money и еще name(тоже просит) впринципе, ошибок нет, но также не сохраняется

Если хотите создавать пользователей с такими параметрами, то и в конструкторе их добавьте:

def __init__(self, id, mode, money, name):

Дк делал-делал так я) логично, что туда надо добавить, терминал полезная штука, но у меня все равно ошибка и на этом моменте я в ступоре

Так теперь у вас ошибка в 112 строке, где конструктор вызывается только с 2 параметрами. Сделайте так:

def __init__(self, id, mode, money = 0, name = ""):
    self.id = id
    self.mode = mode
    self.money = money
    self.name = name
    ...

Теперь без ошибок, но все равно заново рега проходит. Насчет 112 строчки, снизу скрин кинул, а в терминале ошибка User, это я users = read_db() пытался в разных местах прописывать. Может я переборщил с “file.close”, я везде удалил или это ничего страшного?

Да нет, ошибки остались. Теперь в 37 строке класс User оказался еще не объявлен. Переместите строку users = read_bd() ниже объявления User. file.close нужно удалить только внутри блоков with open, но это не относится к текущим ошибкам.