【问题标题】:If you're opening a file using the 'with' statement, do you still need to close the file object?如果你使用'with'语句打开一个文件,你还需要关闭文件对象吗?
【发布时间】:2014-02-12 02:12:51
【问题描述】:

对于打开文件,我习惯了明显较旧的语法:

f = open("sub_ranks.txt","r+")
for line in f:
    ...
f.close()

我已经被告知要改用这种语法几次了..

with open("sub_ranks.txt", "r+") as f:
    for line in f:
        ...

当使用“with”语句时,在第二个示例中是否仍需要文件对象“close”语句?

如果是这样,是否有任何具体的理由使用“with”语句进行文件读取?在这种情况下,它(稍微)更冗长。

【问题讨论】:

    标签: python file import


    【解决方案1】:

    您的直接问题的答案是“否”。 with 块确保当控制离开块时文件将被关闭,无论发生什么原因,包括例外情况(嗯,不包括有人将电源线拉到您的计算机和其他一些罕见事件)。

    所以最好使用with 块。

    现在可以说,打开一个文件只是为了阅读然后没有关闭它并不是那么大问题。当垃圾收集出现时(无论何时),如果不再引用该文件,该文件也将被关闭;最迟会在您的程序退出时发生。事实上,官方文档中的一些代码示例忽略了关闭一个仅为读取访问而打开的文件。写入文件或使用示例中的“read plus”模式时,您肯定需要关闭文件。由于未能正确关闭文件,她对 SO 处理不完整/损坏的文件有很多疑问。

    【讨论】:

      【解决方案2】:

      从 python 文档中,我看到 with 是 try/finally 块的语法糖。 所以,

      Is a file object "close" statement still needed in the second example, when the "with" statement is being used?
      

      没有。

      来自 Python 文档:

      'with' 语句阐明了以前使用的代码 try...finally 块以确保执行清理代码。在这 部分,我将讨论该语句,因为它通常会被使用。在 下一节,我将检查实现细节并展示如何 编写用于此语句的对象。

      'with' 语句是一个控制流结构,其基本结构 是:

      with 表达式 [作为变量]: with-block

      表达式被评估,它应该产生一个对象 支持上下文管理协议(即有 enter() 和 退出() 方法)。

      Here 的另一篇文章说明了这一点。

      【讨论】:

        【解决方案3】:

        没有。

        假设你想像这样打印主机名:

        with open("/etc/hostname","r") as f: print f.read() 
        

        它将打开文件,完成它的工作,然后关闭文件。

        【讨论】:

        【解决方案4】:

        with 语句是一个紧凑的语句,它结合了打开文件和处理文件以及内置异常处理

           with open(filename,file_mode) as file_object:
                  #do the manipulation
        

        所以在这两种情况下都会自动关闭文件:

        • 块编译成功后
        • 或如果遇到错误

        注意:如果您不想使用with 语句,那么您始终可以使用try and except,通过它您可以显式处理异常。

           try :
              #code you wanna run
           except EOFError:
              filehandle.close()
        

        【讨论】:

          猜你喜欢
          • 2017-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-06
          • 2011-07-20
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多