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