with open(...) as f: — это стандартный способ работы с файлами через контекст-менеджер. При таком подходе Python гарантирует автоматическое закрытие файла по выходу из блока with, даже если возникло исключение. Это исключает утечки файловых дескрипторов и блокировки файла.
Внутри блока можно работать с файлом, используя методы объекта (f.read(), f.write(), и т.д.). После выхода из блока (даже при ошибке) вызывается метод f.close().
Пример:
with open('data.txt', 'w') as f: f.write('Hello!') # Здесь файл уже закрыт
Частый вопрос:
Можно ли быть уверенным, что файл, открытый через
open, закроется сразу после выхода из блокаwith, даже если возникло исключение в середине блока?
Ответ: Да, именно это и гарантирует контракт контекст-менеджера: независимо от исключений, метод __exit__ вызывается при выходе из блока, что приводит к закрытию файла. Это главное преимущество по сравнению с явным вызовом f.close().
История
На крупном проекте записи в лог велись через open('log.txt', 'a') и явный вызов f.write(), но про f.close() забывали. После длительной работы процесс израсходовал все файловые дескрипторы ОС, сервис перестал работать.
История
В системе мониторинга использовали постоянное открытие файлов через open, не обрабатывали исключения. При возникновении ошибки файл так и оставался открытым, что приводило к блокировкам при попытке повторного открытия из другого процесса.
История
Разработчик реализовал чтение большого файла через open и сразу сделал return в середине функции, не закрыв файл. В результате несколько таких операций привели к переполнению файловых ресурсов, и ОС стала блокировать новые открытия.