Ошибка с работой над файлом при использовании random
Имеется следующий хэндлер, который должен в ответ на сообщение присылать рандомную строку из файла.
@dp.message_handler(content_types=[*types.ContentTypes.PHOTO, *types.ContentTypes.VIDEO, *types.ContentTypes.VIDEO_NOTE])
async def compliment(message: types.Message):
f = open("Compliment_Bot\complimets.txt", "r", encoding="utf-8")
f.readline()
await bot.send_message(message.from_user.id, text=(f.readline(random.randint(1, 500))))
f.close()
Но при работе он присылает одну и ту же (почему-то вторую). В чём может быть проблема?
Ответы (2 шт):
f = open("Compliment_Bot\complimets.txt", "r", encoding="utf-8")
lines = f.readlines()
lines[random.randint(1, 500)]
lines - это список, а значит начинается с 0.
Еще, если random вернет значение значение > len(lines)-1 будет ошибка, т.к. выйдешь за пределы списка
Аргумент у readline задаёт максимальное число символов, которое будет прочитано. А читаться при этом будет всё-равно одна строка. Вам лучше использовать random.choise, прочитав все строки файла через readlines. Ну и используйте контекстный менеджер, чтобы не закрывать файл "вручную":
with open(r"Compliment_Bot\complimets.txt", encoding="utf-8") as f:
text = random.choice(f.readlines())
await bot.send_message(message.from_user.id, text=text)
Да, ещё используйте raw-string, чтобы не экранировать бэкслэши, а "r" можно не писать - это дефолтный аргумент у open.