【问题标题】:File opened in a function doesn't need to be closed manually?在函数中打开的文件不需要手动关闭吗?
【发布时间】:2014-01-24 17:16:17
【问题描述】:

如果我在函数中打开文件:

In [108]: def foo(fname):
     ...:     f=open(fname)
     ...:     print f
     ...:     

In [109]: foo('t.py')
<open file 't.py', mode 'r' at 0x05DA1B78>

手动关闭f是否更好?为什么?

【问题讨论】:

    标签: python file


    【解决方案1】:

    最好在完成后关闭文件,因为这是一个好习惯,但并非完全必要,因为垃圾收集器会为您关闭文件。您手动关闭它的原因是有更多的控制权。你不知道垃圾收集器什么时候运行。

    但更好的是使用 python 2.5 中引入的 with 语句。

    with open(f_name) as f:
        # do stuff with f
        # possibly throw an exception
    

    无论在 with 语句范围内发生什么,这都会关闭文件。

    【讨论】:

      【解决方案2】:
      $ cat /proc/sys/fs/file-max
      390957
      

      这可能会破坏我的系统(请原谅我没有尝试 :)):

      fs = []
      for i in range(390957+1):
          fs.append(open(str(i), 'w'))
      for f in files:
          f.close()
      

      这(希望)不会:

      for i in range(390957+1):
          with open(str(i), 'w') as f:
              # do stuff
      

      【讨论】:

        【解决方案3】:

        是的,最好手动关闭文件,或者在处理文件时最好使用with 语句(即使发生异常它也会自动为您关闭文件)。在 CPython 中,当垃圾收集器实际销毁文件对象时,未引用的文件对象对象将自动关闭,在此之前,任何未刷新的数据/资源可能仍会在内存中徘徊。

        来自docs

        处理文件时最好使用 with 关键字 对象。这样做的好处是文件在之后正确关闭 它的套件完成了,即使在途中引发了异常。


        相关:

        【讨论】:

          猜你喜欢
          • 2010-10-19
          • 1970-01-01
          • 2020-10-20
          • 2019-08-01
          • 2012-12-11
          • 1970-01-01
          • 2018-05-17
          • 2013-10-22
          • 2015-09-15
          相关资源
          最近更新 更多