генератор текста из файлов txt

в папке с программой есть много файлов txt  и также другие папки  с  текстами  txtна основе этих текстов  нам нужно сделать новый текст  в котором  40 строк
выбор строк и фраз  для текста делаем на основе  ключевых слов  в тексте 
который мы вводим через команду  input


Задача состоит в том, чтобы создать скрипт, который выбирает строки из множества текстовых файлов на основе введённых ключевых слов и формирует итоговый файл, содержащий ровно 40 выбранных строк.

Шаги решения:
Прочитаем файлы .txt из указанной директории и всех вложенных каталогов.
Запрашиваем ключевые слова у пользователя.

Фильтруем строки, содержащие хотя бы одно ключевое слово.
Ограничиваем количество отобранных строк до 40.
Создаем итоговый текстовый файл с результатом.
Пример реализации на Python:




import os

def read_text_files(directory):
    """Чтение содержимого всех .txt-файлов в указанном каталоге и подпапках."""
    texts = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith('.txt'):
                with open(os.path.join(root, file), 'r', encoding='utf-8') as f:
                content = f.read()
                texts.append(content)
    return '\n'.join(texts)

def filter_by_keywords(text, keywords):
    """Фильтрация строк, содержащих указанные ключевые слова."""
    lines = text.splitlines()
    filtered_lines = [line.strip() for line in lines if any(keyword.lower() in line.lower() for keyword in keywords)]
    return filtered_lines[:40]

# Основной сценарий программы
if __name__ == "__main__":
    directory_path = input("Введите путь к папке с файлами: ")
   
    # Чтение всех текстовых файлов
    full_text = read_text_files(directory_path)
   
    # Получение ключевых слов от пользователя
    user_input = input("Введите ключевые слова через запятую: ").strip().split(',')
    keywords = [word.strip() for word in user_input]
   
    # Отбор нужных строк
    selected_lines = filter_by_keywords(full_text, keywords)
   
    # Сохраняем результат в отдельный файл
    output_file_name = "output.txt"
    with open(output_file_name, 'w', encoding='utf-8') as out_file:
        out_file.write('\n'.join(selected_lines))
       
    print(f'Итоговый текст сохранён в {output_file_name}')




Как работает программа?

Сбор текста: Скрипт проходит рекурсивно по указанным папкам и собирает содержимое всех найденных .txt файлов в единую строку.

Выбор строк: Пользователь вводит список ключевых слов, и программа фильтрует строки, содержащие любое из указанных слов.
Создание файла: Первые 40 подобранных строк сохраняются в файл output.txt.
Таким образом, пользователь получает итоговый текст, собранный исключительно из фрагментов исходных документов, соответствующих заданным ключевым словам.





 **




измени код программы так что все тексты находятся в папке  "тексты"
а текст с ключевыми словами мы вводим без запятых и знаков препинания

Ответ >

Изменённый вариант скрипта учитывает новые требования: расположение всех файлов в папке "тексты" и отсутствие разделения ключевых слов запятыми или знаками препинания.


Вот обновленный код программы



import os

def read_text_files(directory):
    """Читает содержимое всех .txt-файлов в указанном каталоге и подпапках"""
    texts = []
    for root, _, files in os.walk(directory):
        for file in files:
            if file.endswith('.txt'):
                with open(os.path.join(root, file), 'r', encoding='utf-8') as f:
                content = f.read()
                texts.append(content)
    return '\n'.join(texts)

def filter_by_keywords(text, keywords):
    """Отбирает строки, содержащие любые из указанных ключевых слов"""
    lines = text.splitlines()
    filtered_lines = [
        line.strip() for line in lines
        if any(keyword.lower() in line.lower() for keyword in keywords)
    ]
    return filtered_lines[:40]

# Основная логика программы
if __name__ == "__main__":
    directory_path = "тексты"  # фиксированный путь к папке с файлами
   
    # Читаем все текстовые файлы
    full_text = read_text_files(directory_path)
   
    # Получаем ключевые слова от пользователя без разделителей
    user_input = input("Введите ключевые слова через пробел: ").strip().split()
    keywords = [word.strip() for word in user_input]
   
    # Выбираем подходящие строки
    selected_lines = filter_by_keywords(full_text, keywords)
   
    # Сохраняем результат в файл
    output_file_name = "output.txt"
    with open(output_file_name, 'w', encoding='utf-8') as out_file:
        out_file.write('\n'.join(selected_lines))
   
    print(f'Итоговый текст сохранён в {output_file_name}')




Особенности нового варианта кода
Папка "тексты" задаётся жестко в коде (directory_path = "тексты").
Ключевые слова теперь вводятся простым списком через пробелы, без запятых и других символов пунктуации.

Итоговый файл сохраняется в корневой директории проекта под именем output.txt.
Теперь пользователю достаточно ввести нужные ключевые слова через пробел, и скрипт автоматически соберёт подходящий контент из имеющихся текстовых файлов.





UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcd in position 1: invalid continuation byte

кажется программа не понимает кодировку  текстов txt

Ответ

Ошибка связана с неправильной кодировкой файлов .txt, вероятно, некоторые из них были созданы не в UTF-8. Для решения проблемы можно добавить обработку возможных разных типов кодировок при чтении файлов.

Можно попробовать сначала прочитать файл в бинарном режиме и определить подходящую кодировку автоматически с помощью библиотеки chardet.

Если библиотека ещё не установлена, её можно установить командой:
bash

pip install chardet
Затем используем следующий исправленный код:


 >>


import os
import chardet

def detect_encoding(file_path):
    """Автоматическое определение кодировки файла"""
    raw_data = open(file_path, 'rb').read()
    result = chardet.detect(raw_data)
    return result['encoding']

def read_text_files(directory):
    """Читает содержимое всех .txt-файлов в указанном каталоге и подпапках"""
    texts = []
    for root, _, files in os.walk(directory):
        for file in files:
            if file.endswith('.txt'):
                file_path = os.path.join(root, file)
                try:
                # Автоматически определяем кодировку перед чтением
                encoding = detect_encoding(file_path)
                with open(file_path, 'r', encoding=encoding) as f:
                content = f.read()
                texts.append(content)
                except Exception as e:
                print(f"Пропускаем файл {file}: ошибка чтения ({e})")
    return '\n'.join(texts)

def filter_by_keywords(text, keywords):
    """Выбирает строки, содержащие хотя бы одно из ключевых слов"""
    lines = text.splitlines()
    filtered_lines = [
        line.strip() for line in lines
        if any(keyword.lower() in line.lower() for keyword in keywords)
    ]
    return filtered_lines[:40]

# Основная логика программы
if __name__ == "__main__":
    directory_path = "тексты"  # фиксированный путь к папке с файлами
   
    # Читаем все текстовые файлы
    full_text = read_text_files(directory_path)
   
    # Получаем ключевые слова от пользователя
    user_input = input("Введите ключевые слова через пробел: ").strip().split()
    keywords = [word.strip() for word in user_input]
   
    # Выбираем подходящие строки
    selected_lines = filter_by_keywords(full_text, keywords)
   
    # Сохраняем результат в файл
    output_file_name = "output.txt"
    with open(output_file_name, 'w', encoding='utf-8') as out_file:
        out_file.write('\n'.join(selected_lines))
   
    print(f'Итоговый текст сохранён в {output_file_name}')



Что изменилось:
Добавлена функция detect_encoding, которая определяет кодировку каждого файла автоматически.
Теперь файлы читаются с использованием подходящей кодировки, предотвращая ошибку UnicodeDecodeError.
Запустите этот обновлённый код, и проблема с некорректной кодировкой должна исчезнуть.




  **




так -
этот код надо изменить
во первых он долго читает тексты
это нам не нужно
нам нужны только  строки с ключевыми словами
поэтому не нужно читать все тексты сразу
потом не понятно почему программа находит строки
но в них нет наших ключевых слов  из текста ввода



Ответ

Проблема длительного ожидания вызвана необходимостью обрабатывать весь объём текста заранее, даже если нужно выбрать лишь определённое число строк с ключевыми словами. Чтобы оптимизировать процесс, лучше всего сканировать файлы постепенно, останавливаясь сразу же после нахождения нужного количества строк.

Давайте внесём изменения в программу таким образом, чтобы:

Не загружались все файлы разом.
Сразу прекращался поиск после сбора необходимого числа строк (40 штук).
Обеспечивалась проверка наличия именно тех ключевых слов, которые введены пользователем.
Оптимизированный алгоритм:
Программа начнёт последовательно просматривать каждый файл и извлекать только строки, соответствующие запросу.
Процесс остановится сразу после нахождения 40 подходящих строк.
вот наш Новый улучшенный код:




import os

def find_matching_lines_in_directory(directory, keywords, max_count=40):
    """
    Ищет строки с ключевыми словами среди всех .txt файлов в указанной папке и возвращает первые max_count строк.
    """
    matching_lines = []
    for root, _, files in os.walk(directory):
        for filename in files:
            if not filename.endswith(".txt"):
                continue
            
            filepath = os.path.join(root, filename)
            try:
                with open(filepath, 'r', encoding="utf-8") as f:
                for line in f:
                stripped_line = line.strip()
                if all(word.lower() in stripped_line.lower() for word in keywords):
                matching_lines.append(stripped_line)
               
                # Проверяем достижение лимита строк
                if len(matching_lines) >= max_count:
                return matching_lines
            except UnicodeDecodeError:
                print(f"Не удалось обработать файл {filename}. Возможно неверная кодировка.")
               
    return matching_lines


if __name__ == "__main__":
    directory_path = "тексты"  # фиксированная папка с файлами
   
    # Получаем ключевые слова от пользователя
    user_input = input("Введите ключевые слова через пробел: ").strip().split()
    keywords = [word.strip() for word in user_input]
   
    # Поиск подходящих строк
    matched_lines = find_matching_lines_in_directory(directory_path, keywords)
   
    # Сохраняем результат в файл
    output_filename = "output.txt"
    with open(output_filename, 'w', encoding='utf-8') as outfile:
        outfile.write("\n".join(matched_lines))
   
    print(f"Сформирован итоговый текст в файле '{output_filename}'.")



Объяснение изменений:
Метод find_matching_lines_in_directory:

Перебираются файлы .txt внутри каталога и подпапок.
Каждый файл открывается, и проверяются строки на наличие всех ключевых слов.
Строки собираются до достижения максимума в 40 элементов.

Если найдено нужное количество строк, выполнение прерывается досрочно.
Проверка точности соответствия:Раньше использовался оператор any() («любое совпадение»), но теперь используется all() («все ключи присутствуют»). Это гарантирует точное попадание искомых слов в каждой строке.

Программа стала значительно быстрее, поскольку больше не обрабатываются целиком большие объёмы текста, а ограничивается только необходимым количеством строк.


Рецензии