Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用with运算符关闭文件_Python_Python 2.7_Python 3.x - Fatal编程技术网

在Python中使用with运算符关闭文件

在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

我有一个关于在python中使用操作符关闭文件的问题

   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
操作的
上下文管理器
设计用于在异常情况下清理相关资源。