


Обработчику иногда нужны промежуточные файлы: распакованные данные, черновик отчёта или результат преобразования. Общая папка temp рядом с проектом создаёт риск смешать запуски. В практикуме Mentoring.digital используем отдельную папку TemporaryDirectory и явно ограничим время её жизни.
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory(prefix="lesson-") as directory:
root = Path(directory)
draft = root / "draft.txt"
draft.write_text("ready", encoding="utf-8")
result = draft.read_text(encoding="utf-8")
print(root.exists(), result)
print(root.exists())Ожидаемый вывод: True ready, затем False. Менеджер создаёт новую папку, а не очищает существующий каталог проекта. Переменная после as содержит имя папки как строку; Path добавляет удобные операции с путями.
Без параметра dir используется выбранная библиотекой временная область системы. Если нужна другая область, передайте существующий разрешённый родительский каталог через dir. Новая папка создаётся внутри него. prefix помогает узнать назначение, но полное имя заранее не фиксируется.
Очистка при штатном разворачивании исключения является частью работы контекстного менеджера. Наличие ошибки в вычислении не требует ручного удаления той же папки в ещё одном finally.
from pathlib import Path
from tempfile import TemporaryDirectory
root = None
try:
with TemporaryDirectory(prefix="lesson-error-") as directory:
root = Path(directory)
(root / "part.txt").write_text("partial", encoding="utf-8")
raise RuntimeError("Processing failed")
except RuntimeError as error:
print(str(error))
print(root is not None and root.exists())После сообщения Processing failed ожидается False. Это проверка обычного исключения, а не обещание очистки при аварийном завершении процесса или отключении питания. Ошибки самой очистки тоже возможны. В частности, на Windows оставшийся открытым файл способен помешать удалению: закрывайте все свои файловые объекты до выхода из блока.
Функция, которая создаёт draft.txt внутри with и возвращает только его путь, отдаёт ссылку на уже удалённый файл. Для небольшого результата прочитайте содержимое до выхода и верните строку или байты. Если нужен постоянный файл, его сохранение в согласованную папку результата должно произойти до очистки.
Не передавайте временный путь фоновой задаче, которая начнёт читать его позже. Дождитесь завершения потребителя внутри контекста или перенесите управление сроком жизни папки на более высокий уровень. Для каждого параллельного запуска создавайте отдельный контекст.
Повторите успешный запуск и запуск с ошибкой после создания первого файла. Проверьте, что результат доступен вызывающему коду, а промежуточная папка исчезла. Такой каталог подходит для собственных промежуточных данных; он не является изолирующей средой для недоверенного кода. Не допускайте посторонних изменений дерева во время очистки.
Работу с файловой системой можно отработать на курсе Python с практикой. Для разбора уже написанного обработчика подготовьте последовательность открытия и закрытия файлов и обсудите её с ментором по Python.