在函数中打开的文件不需要手动关闭?

时间:2014-01-24 17:16:18

标签: python file

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

来自docs

  

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


相关:

答案 2 :(得分:1)

$ 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