генератор текста из файлов txt
выбор строк и фраз для текста делаем на основе ключевых слов в тексте
который мы вводим через команду 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() («все ключи присутствуют»). Это гарантирует точное попадание искомых слов в каждой строке.
Программа стала значительно быстрее, поскольку больше не обрабатываются целиком большие объёмы текста, а ограничивается только необходимым количеством строк.
Свидетельство о публикации №126010800716