-1

对于文件 I/O,目的是什么:

with open

我应该使用它而不是:

 f=open('file', 'w')
 f.write('foo)'
 f.close()
4

4 回答 4

8

始终使用with statement.

来自文档

在处理文件对象时,最好使用with关键字。这样做的好处是文件在其套件完成后正确关闭,即使在途中引发异常也是如此。它也比编写等效try-finally块短得多。

如果您不显式关闭文件,则文件对象可能会在内存中徘徊,直到它被垃圾收集,这会隐式调用close()文件对象。因此,最好使用该with语句,因为即使发生错误,它也会显式关闭文件。

相关:当引用计数为零时,文件对象是否会自动关闭?

于 2013-11-08T22:31:54.490 回答
1

是的。您应该with尽可能使用。

这是使用open作为上下文管理器的返回值。因此,它with不仅专门用于open,而且在任何需要对对象进行一些清理的情况下(通常将其放入finally块中)都应该是首选。在这种情况下:退出上下文时,将.close()调用文件对象的方法。

上下文管理器“清理”的另一个很好的例子是threading's Lock

lock = Lock()

with lock:
    #do thing
#lock is released outside the context

在这种情况下,上下文管理器正在.release()锁定锁。

任何带有__enter__and__exit__方法的东西都可以用作上下文管理器。或者,更好的是,您可以使用装饰 contextlib来制作上下文管理器。更多在这里。@contextmanager

于 2013-11-08T22:40:36.557 回答
0

基本上它试图避免的是:

set things up
try:
    do something
finally:
    tear things down

但是使用该with语句,您可以安全地说打开一个文件,一旦您退出该with语句的范围,该文件就会被关闭。

with语句调用__enter__一个类的函数,它会进行初始设置,并确保它__exit__在最后调用该函数,从而确保一切都正确关闭。

于 2013-11-08T22:35:30.330 回答
-1

with语句是轻松编写更健壮代码的捷径。这个:

with open('file', 'w') as f:
    f.write('foo')

相当于:

try:
    f = open('file', 'w')
    f.write('foo')
finally:
    f.close()
于 2013-11-08T22:35:23.603 回答