Закрывает ли функция with-statement файлы?

В этой простой файловой операции ввода-вывода x.txt закрывается в конце f.read? Кроме того, как мне проверить, открыт ли этот файл или нет?

with open("x.txt") as f:
    data = f.read()

person j0h    schedule 20.11.2014    source источник
comment
Да, открытие с помощью with закроет файл.   -  person Cory Kramer    schedule 20.11.2014
comment
он закрывается после завершения блока, а не после read, вы можете снова прочитать файл, если запустите f.seek(0).   -  person Rafael Barros    schedule 20.11.2014


Ответы (2)


Документация:

Хорошей практикой является использование ключевого слова with при работе с файловыми объектами. Это имеет то преимущество, что файл правильно закрывается после завершения его пакета, даже если в пути возникает исключение. Это также намного короче, чем написание эквивалентных блоков try-finally:

person Community    schedule 20.11.2014
comment
На самом деле это стало так быть с 2.6. В версии 2.5 (где был представлен with) встроенные объекты еще не поддерживали интерфейс менеджера контекста. - person ivan_pozdeev; 20.11.2014
comment
@ivan_pozdeev спасибо за информацию - person ; 20.11.2014

Файловый объект, на который ссылается f, будет закрыт, когда управление покинет блок кода оператора with. На самом деле, именно поэтому вы используете оператор with, чтобы открыть файл в первую очередь. Кроме автоматического закрытия файла по завершении, эта конструкция не имеет смысла.

Вы можете проверить это сами, распечатав флаг f.closed:

with open("x.txt") as f:
    data = f.read()
    ## Still inside with block ##
    print f.closed  # Output: False

## Outside of with block ##
print f.closed  # Output: True
person Community    schedule 20.11.2014
comment
Я только начал Python во вторник. Я ценю помощь. - person j0h; 20.11.2014
comment
Возможно, стоит добавить еще один print f.closed внутри оператора with, чтобы показать, где именно это происходит (в частности, различие, сделанное Рафаэлем Барросом в комментарии). - person abarnert; 20.11.2014