Чтобы развернуть ответ FogleBird, если вы явно не закроете его, файл будет автоматически закрыт при уничтожении объекта файла. В CPython это произойдет, как только на него больше не будет ссылок, например, если это локальная переменная в функции и функция завершается. Однако, если в функцию выдается исключение, а файл явно не закрывается с помощью оператора with
или try:...finally:
, тогда ссылка на файл будет сохранена как часть трассировки стека в объекте трассировки, и файл не будет быть закрытым, по крайней мере, до следующего исключения.
Также IronPython и Jython используют средства сбора мусора .Net CLR и Java JVM соответственно. Это не подсчитанные ссылки, поэтому файл будет оставаться открытым до тех пор, пока сборщик мусора не решит восстановить память объекта или программа не завершится.
Так что в общем случае важно явно закрыть файл, используя with:
или try:...finally:
.
Конечно, все это верно для любого другого типа объекта, который требует явной очистки.