@Asriel

Проблемы с чтением и записью файла. Как решить python?

Где ошибка в моей программе? Я проверяю id человека в телеграме на наличие в файле и, если его нет, записываю его. Но почему-то бот не видит этот id (пока в файле он только один, и то мой)

@bot.message_handler(commands=['start'])
def start (message):
	f=open('Файл.txt','a+')
	t = f.readlines() 
	n=t.find(str(message.chat.id))
	if n>-1:
		bot.send_message(message.chat.id, 'привет'+str(n))
	elif n==-1:
		f.write(' '+ str(message.chat.id))
		bot.send_message(message.chat.id, 'привет'+str(n))
	f.close()

Тут n (индекс начала найденого id) всегда выводит -1. В итоге записываются одинаковые значения

Тут я хочу посчитать количество пользователей и мне выдает ошибку, при этом с обычной строкой оно работает
File "new.py", line 23, in test
a=len(re.findall(r'(\d+)', string))
File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\re.py", line 24
1, in findall
return _compile(pattern, flags).findall(string)
TypeError: expected string or bytes-like object
@bot.message_handler(commands=['test'])
def test (message):
	f=open('Файл.txt','r')
	string = f.readlines() 
	a=len(re.findall(r'(\d+)', string))
	bot.send_message(message.chat.id,str(a))
	f.close()
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
1. Сомневаюсь, что код работает. readlines() возвращает список, а вы пытаетесь вызывать строковый метод
2. Попробуйте просто распечатать содержимое переменной t из первой функции, увидите, что текста там по сути и нет, потому что, при открытии в режиме с +, указатель сразу ставится в конец файла, естественно пропуская все остальные символы
3. Используйте with ... as
4. Не делайте так, как сделали вы. Это очень плохой вариант для хранения данных. Если вам нужно записывать ID пользователей, просто воспользуйтесь библиотекой JSON и храните ID в виде списка чисел. Записывайте данные в файл и читайте его соответственно через нее же. В итоге ваши две большие страшные функции будут заменены на:

import json


@bot.message_handler(commands=['start'])
def start(message):
    with open('Файл.txt', 'r') as f:
        users = json.load(f)

    if message.chat.id not in users:
        users.append(message.chat.id)
        with open('Файл.txt', 'w') as f:
            json.dump(users, f)

    bot.send_message(message.chat.id, f'Привет, {message.chat.id}')


@bot.message_handler(commands=['test'])
def test (message):
    with open('Файл.txt', 'r') as f:
        users = json.load(f)
    bot.send_message(message.chat.id, f'Количество пользователей: {len(users)}')
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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