在Python中使用with运算符关闭文件
我有一个关于在python中使用操作符关闭文件的问题在Python中使用with运算符关闭文件,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我有一个关于在python中使用操作符关闭文件的问题 import os with os.popen('ls') as f: print f.read() raise IOError print f print f 正如您在上面的代码中所看到的,我正在使用with操作符打开一个文件,我知道该文件在退出with块后会自动关闭,但是如果with块内部发生错误,文件对象f会发生什么情况,它会关闭吗?是,它会关闭,您可以在交互式s
import os
with os.popen('ls') as f:
print f.read()
raise IOError
print f
print f
正如您在上面的代码中所看到的,我正在使用
with
操作符打开一个文件,我知道该文件在退出with
块后会自动关闭,但是如果with块内部发生错误,文件对象f
会发生什么情况,它会关闭吗?是,它会关闭,您可以在交互式shell中自己测试它:
with open('somefile.txt') as f:
a = f.read()
print(f.closed) # Will print False
raise IOError
print(f.closed) # Will print True
是的,异常将调用上下文管理器的常规清理代码。在描述上下文管理器和带有语句的
时,从:
with块的执行完成后,将调用对象的\uuuu exit\uuu()
方法,即使该块引发异常,因此可以运行清理代码
无关:您应该使用subprocess.Popen
(或subprocess.call
或其变体之一)而不是os.Popen
(自Python 2.6以来就被弃用)。是。从python文档中:
上下文管理器是定义在执行with语句时要建立的运行时上下文的对象。上下文管理器处理执行代码块所需的运行时上下文的入口和出口。上下文管理器通常使用with语句调用(在with语句一节中描述),但也可以通过直接调用其方法来使用
通常,上下文管理器将实现try..except..finally
模式,以方便使用和重用。
所以,你的问题的答案是肯定的,它处理异常
我知道文件在退出with块后将自动关闭
错误将导致with
块退出。是的,with
操作的上下文管理器
设计用于在异常情况下清理相关资源。