我在Dive Into Python 3中看到过这个成语:
l = list(open('strcpy.c'))
问题是,我怎样才能close
文件?
幕后发生了什么?
我在书中找不到这个信息。
该文件将在其对象被垃圾回收时关闭。在 CPython 中,这几乎在该行执行后立即发生,因为该文件从未分配给变量。在其他 Python 中,例如 Jython 或 IronPython,这可能不会立即发生(或根本不会发生),尽管所有打开的文件在进程退出时总是关闭。
因此,更好的方法是使用 'with' 显式关闭文件:
with open("strcpy.c") as infile:
l = list(infile)
这样做的一个好处是,即使在读取文件时发生异常,文件也会被正确关闭;对于这种情况,您不必使用try/except
块手动编写代码。
如果您想坚持简洁的单行,则可以将with
声明写在一行上。:-)
也就是说,我自己有时会在短期运行的脚本中使用这个习惯用法,在这种情况下,文件打开的时间比严格要求的时间长一点并不是什么大问题。一个优点是您不会用infile
指向已关闭文件的变量(在本例中)使事情变得混乱。
来自文档:
在处理文件对象时,最好使用 with 关键字。这样做的好处是文件在其套件完成后正确关闭,即使在途中引发异常也是如此。
你可以像这样使用它:
with open('strcpy.c') as f:
l = list(f)
就个人而言,我永远不会在没有上下文管理器的情况下打开文件:
with open('strcpy.c') as myfile:
l = list(myfile)
# do stuff with l here
使用上下文管理器时,文件在缩进块的末尾自动关闭。