Python I/O:使用的目的是什么?
对于文件I/O,其目的是什么:Python I/O:使用的目的是什么?,python,io,Python,Io,对于文件I/O,其目的是什么: with open 我应该使用它而不是: f=open('file', 'w') f.write('foo)' f.close() 始终使用 发件人: 处理文件时,最好使用with关键字 物体。这样做的好处是,文件在关闭后会正确关闭 它的套件完成了,即使在途中出现了异常。它也比编写等价的try finally块短得多 如果不显式关闭文件,则文件对象可能会挂起在内存中,直到垃圾回收为止,这会隐式调用文件对象上的close()。因此,最好使用with语句,因
with open
我应该使用它而不是:
f=open('file', 'w')
f.write('foo)'
f.close()
始终使用
发件人:
处理文件时,最好使用with关键字
物体。这样做的好处是,文件在关闭后会正确关闭
它的套件完成了,即使在途中出现了异常。它也比编写等价的try finally
块短得多
如果不显式关闭文件,则文件对象可能会挂起在内存中,直到垃圾回收为止,这会隐式调用文件对象上的close()
。因此,最好使用with
语句,因为即使发生错误,它也会显式关闭文件
相关:with语句是一种快捷方式,可以轻松编写更健壮的代码。这:
with open('file', 'w') as f:
f.write('foo')
相当于:
try:
f = open('file', 'w')
f.write('foo')
finally:
f.close()
基本上,它试图避免的是:
set things up
try:
do something
finally:
tear things down
但是使用with
语句,您可以安全地说打开一个文件,一旦退出with
语句的范围,文件就会关闭
with
语句调用一个类的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
函数,该函数进行初始设置,并确保在结束时调用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu退出
函数,以确保所有内容都正确关闭。是。尽可能将与
一起使用
这是使用open
的返回值作为参数。因此,with
不仅专门用于打开
,而且在任何情况下都应该优先考虑对对象进行一些清理(通常会将其放入最终
块)。在这种情况下:退出上下文时,将调用file对象的.close()
方法
上下文管理器“清理”的另一个好例子是线程化的锁定:
lock = Lock()
with lock:
#do thing
#lock is released outside the context
在这种情况下,上下文管理器正在.release()
-解除锁定
任何带有\uuuuuuuuuuuuuuuuuuuuuu
和\uuuuuuuuuuuuuu
方法的内容都可以用作上下文管理器。或者,更好的是,您可以使用contextlib
制作带有@contextmanager
装饰的上下文管理器 +1。但是文档没有提到如果您忘记调用close
,文件也会关闭。或者,如果在函数的中间添加<代码>返回<代码>,而不添加“<代码>关闭< /代码>”。而且比较短。对读者来说,更明显的是你关闭了文件,所以如果我试图调试你的代码,我不必检查所有的代码路径,以确保错误不是你泄露了文件。依此类推。@abarnert是的,奇怪的是在文件IO部分中没有提到它,但在模块的文档中可以找到一小行:(包括垃圾收集对象时的隐式关闭)。我不知道这是否真的奇怪,甚至是文档中的缺陷。异常问题是问题中最难解决的部分,所以他们告诉你它解决了这个问题,让你去发现它也解决了所有更简单的问题。这可能不足以让一个人单独阅读一个段落,但对于一个人来说,通过按顺序阅读教程来学习可能没什么问题,这正是本教程的真正目的。实际上,open
返回的文件对象是一个上下文管理器,而不是open
函数。但这只是一个小小的诡辩,总体的解释很好(特别是给出了lock
作为一个明显但完全无关的例子)。是的,我在某个时候无意中提到了文件句柄。。我会改写的。