Back to home

当使用一个文件对象"__iter__"方法直接操作还需要close?

原以为Python会在iter返回的对象抛出StopIteration错误时关闭掉file handler.答案很明显,必须要显示关闭.

我们平常使用:

 for line in open("t.txt"):
    #do some thing with line
    pass

没有发现问题,是因为在程序运行完后垃圾收集时自动将open打开的file handler自动close掉了.虽然有垃圾处理.但是手动显示关闭才是准确可控. 所以我们可能会写下如下:

f = open("t.txt")
try:
    #do some thing with line
finally:
    f.close()

代码有点多,我仅仅只是需要从文件中读取内容,其他的错误我都不在乎,流程可能是如果文件打不开,那么结果必然出错.
好在python2.5以及之后的版本提供了with_statement,简化了需要关闭的IO操作.

from __future__ import with_statement
with open("t.txt") as f:
    #do some thing with line
    pass

不仅仅局限于file handler,你也可以使用在管道IO上:

with os.popen(commend) as f:
    return f.read()

当然,在linux中,他们都算是一个file hanlder. 你甚至可以对任何需要使用完就关闭的对象使用with,比如Lock:

with threading.Lock():
    pass # do some thread safe stuff

即时关闭占用着的内存.节约资源,人人有责.