✅ Решения заданий

⚡ Решения в двух словах

  • 1 — Counter, чистим пунктуацию, выводим топ-N.
  • 2 — открываем два файла в with, копируем непустые строки.
  • 3 — фильтруем файлы по расширению через os.listdir() или os.walk().
  • 4 — ищем ключевое слово в строках и записываем совпадения.
  • 5 — используем множество для отслеживания уже встреченных строк.
⚠️ Рекомендация: попробуйте решить задания самостоятельно, прежде чем смотреть ответы. Решения — это последняя инстанция, когда собственные попытки исчерпаны.

Решение задания 1. Подсчёт частоты слов

# solution_01_word_frequency.py
from collections import Counter


def count_words_in_file(filename):
    with open(filename, "r", encoding="utf-8") as file:
        text = file.read().lower()

    punctuation = '.,!?;:"-'
    for char in punctuation:
        text = text.replace(char, " ")

    return Counter(text.split())


filename = input("Введите имя файла: ")

try:
    word_counts = count_words_in_file(filename)
    num_words = int(input("Введите количество популярных слов: "))

    print("\nПопулярные слова:")
    for word, count in word_counts.most_common(num_words):
        print(f"{word}: {count}")

except FileNotFoundError:
    print("Ошибка: Файл не найден.")
except ValueError:
    print("Ошибка: Введите целое число для количества популярных слов.")

Логика: читаем весь файл, приводим к нижнему регистру, заменяем знаки препинания на пробелы и считаем слова через Counter. Обрабатываем отсутствие файла и некорректный ввод числа.

Решение задания 2. Удаление пустых строк

# solution_02_remove_empty.py
import os


filename = input("Введите имя файла: ")
new_filename = f"{os.path.splitext(filename)[0]}_cleaned.txt"

try:
    with (
        open(filename, "r", encoding="utf-8") as infile,
        open(new_filename, "w", encoding="utf-8") as outfile,
    ):
        for line in infile:
            if line.strip():
                outfile.write(line)
    print(f"Пустые строки удалены, сохранено в {new_filename}.")
except FileNotFoundError:
    print(f"Ошибка: файл '{filename}' не найден.")

Логика: формируем имя выходного файла через os.path.splitext. Открываем оба файла в одном блоке with и копируем только те строки, которые не пустые после strip().

Решение задания 3. Файлы с заданным расширением

# solution_03_by_extension.py
import os
import sys


def find_files_by_extension(directory, extension):
    if not extension.startswith("."):
        extension = "." + extension

    found = []
    for filename in os.listdir(directory):
        if filename.endswith(extension):
            found.append(filename)
    return found


if len(sys.argv) != 3:
    print("Использование: python script.py <директория> <расширение>")
else:
    directory = sys.argv[1]
    extension = sys.argv[2]

    try:
        files = find_files_by_extension(directory, extension)
        print(f"Найденные файлы в директории '{directory}':")
        print(", ".join(files) if files else "Файлы не найдены.")
    except FileNotFoundError:
        print(f"Ошибка: директория '{directory}' не найдена.")

Логика: получаем директорию и расширение из аргументов командной строки. Перебираем файлы через os.listdir() и отбираем те, что заканчиваются на нужное расширение.

Решение задания 4. Фильтрация по ключевому слову (LMS)

# solution_04_filter_keyword.py

def filter_by_keyword(filename, keyword):
    output_filename = f"{keyword}_{filename}"
    matches = []

    with open(filename, "r", encoding="utf-8") as file:
        for line in file:
            if keyword in line:
                matches.append(line)

    if matches:
        with open(output_filename, "w", encoding="utf-8") as file:
            file.writelines(matches)
        print(f"Строки, содержащие '{keyword}', сохранены в {output_filename}.")
    else:
        print(f"Совпадений для '{keyword}' не найдено.")


filename = input("Введите имя файла для поиска: ")
keyword = input("Введите ключевое слово: ")

try:
    filter_by_keyword(filename, keyword)
except FileNotFoundError:
    print(f"Ошибка: файл '{filename}' не найден.")

Логика: читаем файл построчно, отбираем строки, содержащие ключевое слово. Если есть совпадения, создаём выходной файл; иначе сообщаем, что совпадений нет.

Решение задания 5. Удаление дубликатов (LMS)

# solution_05_remove_duplicates.py

def remove_duplicates(filename):
    output_filename = f"unique_{filename}"
    seen = set()
    unique_lines = []

    with open(filename, "r", encoding="utf-8") as file:
        for line in file:
            if line not in seen:
                seen.add(line)
                unique_lines.append(line)

    with open(output_filename, "w", encoding="utf-8") as file:
        file.writelines(unique_lines)

    print(f"Дубликаты удалены. Уникальные строки сохранены в {output_filename}.")


filename = input("Введите имя файла: ")

try:
    remove_duplicates(filename)
except FileNotFoundError:
    print(f"Ошибка: файл '{filename}' не найден.")

Логика: используем множество seen для отслеживания уже встреченных строк и список unique_lines для сохранения порядка. Если дубликатов нет, файл просто копируется.