Python 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语句,因

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

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
作为一个明显但完全无关的例子)。是的,我在某个时候无意中提到了文件句柄。。我会改写的。