Дескриптор файла становится закрытым автоматически в Python после того, как он выйдет из объема?

Если я делаю следующее, делает дескриптор файла, закрываются автоматически, поскольку он выходит из объема в Python:

def read_contents(file_path):
  return file(file_path).read()

Если это не делает, как я могу записать эту функцию для закрытия объема автоматически?

22
задан bodacydo 8 March 2010 в 20:18
поделиться

2 ответа

Он должен закрыть дескриптор файла в операторе __ 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 для получения дополнительной информации.

20
ответ дан 29 November 2019 в 04:01
поделиться

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

Также IronPython и Jython используют средства сбора мусора .Net CLR и Java JVM соответственно. Они не подсчитываются по ссылкам, поэтому файл будет оставаться открытым бесконечно, пока сборщик мусора не решит освободить память объекта или пока программа не завершится.

В общем, важно явно закрыть файл, используя либо с: , либо try: ... finally: .

Конечно, все это верно для любого другого типа объекта, который требует явной очистки.

35
ответ дан 29 November 2019 в 04:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: