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

时间:2017-07-31 04:54:00

标签: python python-2.7 python-3.x

我对python with运算符

中的文件关闭有疑问
   import os

    with os.popen('ls') as f:
        print f.read()
        raise IOError
        print f
    print f

正如您在上面的代码中看到的,我正在使用with运算符打开一个文件,我知道该文件将在退出with块后自动关闭,但如果发生某些错误在内部阻止文件对象f会发生什么,它会关闭吗?

4 个答案:

答案 0 :(得分:4)

是。来自python docs:

  

上下文管理器是一个对象,它定义在执行with语句时要建立的运行时上下文。上下文管理器处理进入和退出所需运行时上下文以执行代码块。通常使用with语句调用上下文管理器(在with语句一节中描述),但也可以通过直接调用它们的方法来使用。

通常,上下文管理器将实现try..except..finally模式以方便和重用。 所以,你的问题的答案是肯定的,它处理例外。

答案 1 :(得分:3)

是的,异常将调用上下文管理器的常用清理代码。从PEP 343开始,在描述上下文管理器和with语句时:

  

执行 with-block 后,即使块引发异常,也会调用对象的__exit__()方法,因此可以运行清理码。

无关:您应该使用subprocess.Popen(或subprocess.call或其中一个变体)而不是os.popen(自Python 2.6以来已弃用)。

答案 2 :(得分:2)

是的它会关闭,您可以在交互式shell中自行测试:

with open('somefile.txt') as f:
    a = f.read()
    print(f.closed) # Will print False
    raise IOError

print(f.closed) # Will print True

答案 3 :(得分:0)

  

我知道文件将在退出with block

后自动关闭

错误将导致with块退出。