Как использовать цикл for для чтения строк из текстового файла?

Добрый день! Можете, пожалуйста, помочь мне? Я хочу создать простой фильтр для запрещенных слов. В представленном коде, я использую следующий обработчик сообщений:

```python
@dp.message_handler()
async def mat(message: types.Message):
    #mat = ["слово1", "слово2"]
    file_mat = open("all_mat.txt", "r")
    mat = file_mat
    for i in mat:
        if len(message.text) > len(message.text.replace(i, "")):
            await message.delete()
            await message.answer(f"{message.from_user.first_name}, ваше сообщение удалено!")
        break
    file_mat.close()
```

Когда я использую список, заданный внутри функции, например `mat = ["слово1", "слово2"]`, все работает корректно. Однако я хотел бы перенести этот список в файл `words.txt`. Я изучил документацию и попытался пройтись циклом по файлу, но не уверен, что делаю это правильно. Могли бы вы подсказать, как правильно реализовать это?
  • 21 февраля 2025 г. 8:34
Ответы на вопрос 2
Добрый день! Конечно, я помогу вам с реализацией фильтра для запрещенных слов, который читает слова из текстового файла.

Ваш код уже близок к правильному решению, но есть несколько моментов, которые нужно исправить:

1. Вы открываете файл `all_mat.txt`, но не считываете его содержимое в список. Вместо этого вы используете сам файл как объект итерации, что не является корректным.
2. Нужно убедиться, что строки считываются правильно: удалите лишние пробелы и переведите их в нижний регистр (если это необходимо).
3. Не забывайте аккуратно закрывать файл, можно использовать контекстный менеджер `with`, чтобы он закрывался автоматически.

Вот исправленный код:

```python
@dp.message_handler()
async def mat(message: types.Message):
    # Читаем запрещенные слова из файла
    with open("all_mat.txt", "r", encoding="utf-8") as file_mat:
        mat = [line.strip() for line in file_mat]  # Считываем строки из файла и удаляем пробелы на краях

    # Проверяем, есть ли запрещенные слова в сообщении
    for forbidden_word in mat:
        if forbidden_word in message.text:
            await message.delete()
            await message.answer(f"{message.from_user.first_name}, ваше сообщение удалено!")
            return  # Выходим из функции после удаления сообщения, чтобы избежать неоднократного срабатывания
```

### Объяснение:

1. **Чтение из файла**: Мы использовали конструкцию `with open(...)`, чтобы открыть файл. Это гарантирует, что файл будет закрыт, даже если возникнет ошибка.
2. **Создание списка**: `mat = [line.strip() for line in file_mat]` создает список `mat`, где каждое слово — это строка из файла без лишних пробелов.
3. **Проверка слова**: Мы проходимся по каждому запрещенному слову в списке `mat` и проверяем его наличие в сообщении.
4. **Возврат**: Если слово найдено и сообщение удалено, используется `return`, чтобы избежать дальнейших проверок.

Теперь ваш код будет читать запрещенные слова из файла и правильно обрабатывать сообщения. Убедитесь, что файл `all_mat.txt` существует и в нём по одному запрещенному слову на строку.
решил другим способом: 
создал Py файл list_mat в котором есть список list

from list_mat import list

@dp.message_handler()
async def mat(message: types.Message):
    for i in list:
        if len(message.text) > len(message.text.replace(i, "")):
            await message.delete()
            await message.answer(f"{message.from_user.first_name}, ваше сообщение удалено!")
        break
Похожие вопросы