Глава 15 · Python и файлы
Жизненный цикл файла и with
with — не просто удобный синтаксис, а гарантия корректного закрытия ресурса.
Жизненный цикл файла
ЗАКРЫТ
open()
↓ОТКРЫТ
↓
ОТКРЫТ
чтение / запись
close()
↓ЗАКРЫТ
С менеджером контекста
вход в 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, без установки