1

我在Dive Into Python 3中看到过这个成语:

l = list(open('strcpy.c'))

问题是,我怎样才能close文件?

幕后发生了什么?

我在书中找不到这个信息。

4

3 回答 3

4

该文件将在其对象被垃圾回收时关闭。在 CPython 中,这几乎在该行执行后立即发生,因为该文件从未分配给变量。在其他 Python 中,例如 Jython 或 IronPython,这可能不会立即发生(或根本不会发生),尽管所有打开的文件在进程退出时总是关闭。

因此,更好的方法是使用 'with' 显式关闭文件:

with open("strcpy.c") as infile:
    l = list(infile)

这样做的一个好处是,即使在读取文件时发生异常,文件也会被正确关闭;对于这种情况,您不必使用try/except块手动编写代码。

如果您想坚持简洁的单行,则可以将with声明写在一行上。:-)

也就是说,我自己有时会在短期运行的脚本中使用这个习惯用法,在这种情况下,文件打开的时间比严格要求的时间长一点并不是什么大问题。一个优点是您不会用infile指向已关闭文件的变量(在本例中)使事情变得混乱。

于 2013-07-26T19:38:07.507 回答
2

来自文档

在处理文件对象时,最好使用 with 关键字。这样做的好处是文件在其套件完成后正确关闭,即使在途中引发异常也是如此。

你可以像这样使用它:

with open('strcpy.c') as f:
    l = list(f)
于 2013-07-26T19:37:47.900 回答
2

就个人而言,我永远不会在没有上下文管理器的情况下打开文件:

with open('strcpy.c') as myfile:
    l = list(myfile)
# do stuff with l here

使用上下文管理器时,文件在缩进块的末尾自动关闭。

于 2013-07-26T19:38:42.020 回答