4

如果我做了以下事情:

import codecs
lines = codecs.open(somefile, 'r','utf8').readlines()

有没有办法关闭我没有初始化的文件?如果是这样,怎么做?通常,我可以这样做:

import codecs
reader = codecs.open(somefile, 'r','utf8') 
lines = reader.readlines()
reader.close()
4

1 回答 1

6

在 CPython 中,文件对象将在引用计数降至 0 时自行关闭,即在.readlines()返回之后。对于其他 Python 实现,可能需要更长的时间,具体取决于所使用的垃圾收集算法。该文件肯定会在程序退出之前关闭。

您应该真正将文件对象用作上下文管理器,并在with其上关闭语句调用:

with codecs.open(somefile, 'r','utf8') as reader:
    lines = reader.readlines()

一旦在with语句下缩进的代码块退出(无论是异常、areturncontinue语句break,还是仅仅因为块中的所有代码都执行完毕),reader文件对象将被关闭。

额外提示:文件对象是可迭代的,因此以下内容也适用:

with codecs.open(somefile, 'r','utf8') as reader:
    lines = list(reader)

获得完全相同的结果。

于 2013-07-01T07:38:36.073 回答