Глава 15 · Python и файлы

Жизненный цикл файла и with

with — не просто удобный синтаксис, а гарантия корректного закрытия ресурса.

Жизненный цикл файла

ЗАКРЫТ
open()
ОТКРЫТ
ОТКРЫТ
чтение / запись
close()
ЗАКРЫТ
Ручной жизненный цикл: открыть → работать → не забыть закрыть.

С менеджером контекста

вход в with
ОТКРЫТ
работа внутри блока
выход из with — автоматически
ЗАКРЫТ
with гарантирует закрытие даже при ошибке внутри блока.
with_protokol.py
with open("privet.txt", "r", encoding="utf-8") as file:
    print(file.closed)   # False — файл открыт внутри блока
print(file.closed)       # True — закрылся сам при выходе из блока
with — это не просто «модный синтаксис»
with появился в Python 2.5 — дело не в новизне, а в надёжном управлении ресурсом: даже если внутри блока произойдёт исключение, протокол менеджера контекста всё равно выполнит корректное закрытие файла.

Что происходит под капотом

Это часть объектной модели Python: объекты, участвующие в with, поддерживают специальное поведение при входе и выходе из блока — методы __enter__ и __exit__. Пока не нужно уметь писать свои такие объекты — достаточно знать, что файлы — лишь одно из применений этого протокола, а не какая-то функциональность, придуманная специально для файлов.

Ручное закрытие — исторический вариант

ruchnoe_zakrytie.py
file = open("privet.txt", "r", encoding="utf-8")
content = file.read()
file.close()   # нужно не забыть — и выполнить даже при ошибке выше
with — не просто новее, а надёжнее
Ручное открытие/закрытие всё ещё работает и встречается в старом коде, но with рекомендуется не потому, что он новее, а потому, что закрытие происходит гарантированно, даже при ошибке.
Практика: жизненный цикл файла
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →