2013-07-03 5 views
4

Я прочитал, что при открытии файла с помощью ниже форматФайл открывается и закрывается в питона

with open(filename) as f: 
     #My Code 
f.close() 

явное закрытие файла не требуется. Может кто-нибудь объяснить, почему это так? Также, если кто-то явно закрывает файл, будет ли он иметь какой-либо нежелательный эффект?

+0

http://effbot.org/zone/python-with-statement.htm – piokuc

+0

Я удалил тег '' питон-2.7'', потому что оператор with не является специфичным для этой версии Python. Оператор с был введен в Python 2.5 и с тех пор является фундаментальной особенностью Python. Страница промежуточного блога на эту тему находится здесь: (http://preshing.com/20110920/the-python-with-statement-by-example/) – eyquem

ответ

11

Обзор с милями: когда вы покидаете вложенный блок, Python автоматически вызывает f.close().

Не имеет значения, выходите ли вы просто снижаясь со дна или звоните break/continue/return, чтобы выпрыгнуть из него или вызвать исключение; независимо от того, как вы покинете этот блок. Это всегда знает, что вы уезжаете, так что всегда закрывает файл *


Один уровень вниз, вы можете думать о нем, как отображение на try:/finally: заявление:.

f = open(filename) 
try: 
    # My Code 
finally: 
    f.close() 

Один уровень вниз: Как это известно, чтобы позвонить close вместо чего-то другого?

Ну, на самом деле это не так. Это на самом деле требует специальных методов __enter__ и __exit__:

f = open() 
f.__enter__() 
try: 
    # My Code 
finally: 
    f.__exit__() 

и объект, возвращаемый openfile в Python 2, один из оберток в io в Python 3) есть что-то вроде этого в нем:

def __exit__(self): 
    self.close() 

Это на самом деле немного сложнее, чем последняя версия, что упрощает создание сообщений об ошибках и позволяет Python избегать «ввода» блока, который не знает, как t o «выход».

Чтобы понять все детали, перейдите по ссылке PEP 343.


Кроме того, если кто-то явно закрыть файл, он будет иметь какой-либо нежелательный эффект?

В общем, это плохая вещь.

Однако файловые объекты выходят из своего пути, чтобы сделать его безопасным. Ошибка заключается в закрытом файле, кроме close.


* Если вы не оставить, скажем, потянув за шнур на сервере в середине его выполнения вашего скрипта. В этом случае, очевидно, он никогда не запускает код, а тем более close. Но явный close вряд ли вам поможет.

3

Закрытие не требуется, потому что заявление with автоматически позаботится об этом.

В with заявлении __enter__ метод на open(...) называется, и как только вы выходите из этого блока метод __exit__ называется.

Так что закрыть его вручную просто бесполезно, так как метод __exit__ позаботится об этом автоматически.

Что касается f.close(), то это не так, но бесполезно. Он уже закрыт, поэтому ничего не будет.

Также см этот BlogPost для получения дополнительной информации о with заявлении: http://effbot.org/zone/python-with-statement.htm

 Смежные вопросы

  • Нет связанных вопросов^_^