Записывается ли файл-манипулятор автоматически в Python после того, как он выходит из области видимости?
Если я делаю следующее: дескриптор файла автоматически закрывается, поскольку он выходит за пределы области действия в Python:
def read_contents(file_path):
return file(file_path).read()
Если это не так, как я могу написать эту функцию, чтобы автоматически закрыть область?
Ответы
Ответ 1
Он должен закрыть дескриптор файла в файле __del__
, но лучше использовать блок with
:
def read_contents(file_path):
with open(file_path, 'r') as f:
return f.read()
Подробнее см. http://docs.python.org/library/stdtypes.html#file.close.
Ответ 2
Чтобы развернуть ответ FogleBird, если вы явно не закрыли его, файл будет автоматически закрыт при уничтожении файлового объекта. В CPython это произойдет, как только нет ссылок на него, например. если это локальная переменная в функции, и функция заканчивается. Однако, если исключение выбрано в функции, и файл явно не закрыт с помощью оператора with
или try:...finally:
, то ссылка на файл будет храниться как часть трассировки стека в объекте traceback, и файл не будет быть закрытым, по крайней мере, до тех пор, пока не будет выброшено следующее исключение.
Также IronPython и Jython используют средства сбора мусора .Net CLR и Java JVM соответственно. Это не подсчет ссылок, поэтому файл будет оставаться открытым до бесконечности, пока сборщик мусора не решит вернуть память объекта или программа не завершится.
Таким образом, в общем случае важно явно закрыть файл, используя либо with:
, либо try:...finally:
.
Конечно, все это справедливо для любого другого типа объекта, который требует явной очистки.