我经常看到这种代码:
filecontent = open(thefilename).read()
我想知道在这种情况下,由open
创建的文件对象会发生什么:它会被隐式关闭,还是会保持在某个地方开启?
我经常看到这种代码:
filecontent = open(thefilename).read()
我想知道在这种情况下,由open
创建的文件对象会发生什么:它会被隐式关闭,还是会保持在某个地方开启?
with open(thefilename) as f:
filecontent = f.read()
这保证了当with
语句结束时,f.close()
会被立即调用。
偶尔会有人建议将其变成一行代码,对此Guido总是回答类似于:“with open(thefilename) as f: filecontent = f.read()
已经是一行代码了。虽然不太好看,但远比你建议的要好得多。”
但实际上,还有一个更好的答案:编写一个包装它的函数:
def read_whole_file(filename):
with open(thefilename) as f:
return f.read()
然后:
filecontent = read_whole_file(thefilename)
简洁、明了、易读……没有借口使用 "open
全部打开并让垃圾回收处理" 这种 hack。
__del__
方法是循环引用的一部分,它将不会被调用-我不知道这是否会影响文件(我认为它们仍然会在解释器关闭时关闭),但对于我们自己的对象可能很重要。 - user395760exit
。(不确定Windows等效文档在哪里记录。) - abarnert