【发布时间】: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是否更好?为什么?
【问题讨论】:
如果我在函数中打开文件:
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 2.5 中引入的 with 语句。
with open(f_name) as f:
# do stuff with f
# possibly throw an exception
无论在 with 语句范围内发生什么,这都会关闭文件。
【讨论】:
$ 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
【讨论】:
是的,最好手动关闭文件,或者在处理文件时最好使用with 语句(即使发生异常它也会自动为您关闭文件)。在 CPython 中,当垃圾收集器实际销毁文件对象时,未引用的文件对象对象将自动关闭,在此之前,任何未刷新的数据/资源可能仍会在内存中徘徊。
来自docs:
处理文件时最好使用 with 关键字 对象。这样做的好处是文件在之后正确关闭 它的套件完成了,即使在途中引发了异常。
相关:
【讨论】: