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

⚡ Ответы в двух словах

  • 1 — Ошибка
  • 2 — Ошибка преобразования | Блок finally
  • 3 — Начало | Общее исключение | Блок finally
  • 4 — finally
  • 5 — format
  • 6 — ..
  • 7 — os.path.exists
  • 8 — os.makedirs(..., exist_ok=True)
  • 9 — os.rename
  • 10 — os.path.basename
  • 11 — a и b
  • 12 — Нет аргументов
⚠️ Рекомендация: попробуйте решить задания самостоятельно, прежде чем смотреть ответы.

Ответы на тест

Вопрос 1. Возникает KeyError, потому что ключа "c" нет в словаре. Обработчик IndexError не подходит, сработает except Exception.

Правильный ответ: Ошибка

Вопрос 2. Блок except ValueError выполняется и печатает текст с end=" | ", затем всегда выполняется finally.

Правильный ответ: Ошибка преобразования | Блок finally

Вопрос 3. Сначала печатается "Начало", затем возбуждается ValueError. ZeroDivisionError не подходит, срабатывает Exception. В конце выполняется finally.

Правильный ответ: Начало | Общее исключение | Блок finally

Вопрос 4. Блок finally выполняется всегда, независимо от того, было исключение или нет.

Правильный ответ: finally

Вопрос 5. Параметр format задаёт строку формата для записей лога.

Правильный ответ: format

Вопрос 6. Две точки .. обозначают родительскую директорию.

Правильный ответ: ..

Вопрос 7. Функция os.path.exists(path) проверяет, существует ли файл или директория.

Правильный ответ: os.path.exists(path)

Вопрос 8. os.makedirs создаёт промежуточные директории, а exist_ok=True отключает ошибку, если они уже есть.

Правильный ответ: os.makedirs(path, exist_ok=True)

Вопрос 9. Для переименования файла используется os.rename.

Правильный ответ: os.rename("old.txt", "new.txt")

Вопрос 10. os.path.basename возвращает последний компонент пути — имя файла.

Правильный ответ: os.path.basename(path)

Вопрос 11. os.path.join корректно соединяет пути и избавляет от ошибок ручной склейки. Он не меняет текущую директорию и не создаёт файлов.

Правильный ответ: a и b

Вопрос 12. sys.argv[0] — это имя скрипта. Пользовательских аргументов нет, поэтому длина списка равна 1.

Правильный ответ: Нет аргументов

Решение мини-задачи 1. Поиск текстовых файлов

# find_txt.py
import os
import sys


def find_txt_files(directory: str) -> list[str]:
    """Рекурсивно ищет все .txt файлы в директории."""
    found: list[str] = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(".txt"):
                found.append(os.path.join(root, file))
    return found


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Использование: python find_txt.py <директория>")
        sys.exit(1)

    target_dir = sys.argv[1]

    if not os.path.isdir(target_dir):
        print(f"Ошибка: директория '{target_dir}' не существует.")
        sys.exit(1)

    txt_files = find_txt_files(target_dir)
    if txt_files:
        print("Найдены .txt файлы:")
        for path in txt_files:
            print(f"- {path}")
    else:
        print("Текстовые файлы не найдены.")

Логика: скрипт проверяет количество аргументов, существование директории, затем обходит дерево с помощью os.walk и собирает пути к файлам с расширением .txt.

Решение мини-задачи 2. Безопасное преобразование с логированием

# safe_int.py
import logging
from typing import Optional

logging.basicConfig(
    filename="conversion.log",
    format="%(asctime)s - %(levelname)s - %(message)s",
    level=logging.ERROR,
)


def safe_int(value: str) -> Optional[int]:
    """Преобразует строку в int или возвращает None при ошибке."""
    try:
        return int(value)
    except ValueError:
        logging.error(f"Не удалось преобразовать '{value}' в целое число")
        return None


if __name__ == "__main__":
    print(safe_int("42"))   # 42
    print(safe_int("abc"))  # None

Логика: функция пытается преобразовать строку. Если возникает ValueError, ошибка записывается в лог и возвращается None.