Ошибка с работой над файлом при использовании 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 шт):

Автор решения: Fedor March
f = open("Compliment_Bot\complimets.txt", "r", encoding="utf-8")
lines = f.readlines()
lines[random.randint(1, 500)]

lines - это список, а значит начинается с 0. Еще, если random вернет значение значение > len(lines)-1 будет ошибка, т.к. выйдешь за пределы списка

→ Ссылка
Автор решения: CrazyElf

Аргумент у 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.

→ Ссылка