对于文件I / O的目的是什么:
with open
我应该使用它而不是:
f=open('file', 'w')
f.write('foo)'
f.close()
答案 0 :(得分:8)
始终使用with statement
。
来自docs:
在处理文件时,最好使用 with 关键字 对象。这样做的好处是文件在之后正确关闭 即使在途中出现异常,它的套件也会完成。它也比编写等效的
try-finally
块短得多。
如果您没有显式关闭文件,那么文件对象可能会在内存中闲逛,直到它被垃圾回收,这会隐式调用文件对象上的close()
。因此,最好使用with
语句,因为即使发生错误,它也会显式关闭文件。
相关:Does a File Object Automatically Close when its Reference Count Hits Zero?
答案 1 :(得分:1)
是。您应该尽可能使用with
。
这是使用open
的返回值作为 context manager 。因此,with
不仅仅用于open
,而且在任何情况下都应该优先考虑对象(通常放在finally
中进行一些清理块)。在这种情况下:退出上下文时,将调用文件对象的.close()
方法。
上下文管理器“清理”的另一个好例子是threading
的{{1}}:
Lock
在这种情况下,上下文管理器是lock = Lock()
with lock:
#do thing
#lock is released outside the context
- 锁定。
使用.release()
和__enter__
方法的任何内容都可以用作上下文管理器。或者,更好的是,您可以使用__exit__
来制作具有contextlib
装饰的上下文管理器。 More here.
答案 2 :(得分:0)
基本上它试图避免的是:
set things up
try:
do something
finally:
tear things down
但是使用with
语句可以安全地说,打开一个文件,一旦退出with
语句的范围,文件就会被关闭。
with
语句调用类的__enter__
函数,该函数执行初始设置,并确保在最后调用__exit__
函数,这样可确保一切正确关闭。
答案 3 :(得分:-1)
with
语句是轻松编写更健壮代码的快捷方式。这样:
with open('file', 'w') as f:
f.write('foo')
相当于:
try:
f = open('file', 'w')
f.write('foo')
finally:
f.close()