从open()创建列表时关闭文件

时间:2013-07-26 19:34:23

标签: python file list

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

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

问题是,我如何close该文件?

幕后发生了什么事吗?

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

3 个答案:

答案 0 :(得分:4)

当对象被垃圾收集时,文件将被关闭。在CPython中,这种情况在执行该行之后立即发生,因为文件永远不会分配给变量。在其他Pythons中,例如Jython或IronPython,这可能不会马上(或根本不会)发生,尽管所有打开的文件在进程退出时总是关闭。

出于这个原因,更好的方法是使用'with'显式关闭文件:

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

这样做的一个优点是即使在读取文件时发生异常,文件也会正确关闭;您不必使用try/except块手动编写此案例的代码。

如果你想坚持简洁的单行,可以在一行写一个with语句。 : - )

那就是说,我有时会在短时间运行的脚本中使用这个成语,其中文件打开时间比它严格要求的时间长得多并不是什么大问题。一个优点是,您不会使用指向已关闭文件的变量(在这种情况下为infile)混乱。

答案 1 :(得分:2)

来自doc

  

最好在处理文件时使用with关键字   对象。这样做的好处是文件在之后正确关闭   它的套件即使在路上引发异常也会完成。

你可以像这样使用它:

with open('strcpy.c') as f:
    l = list(f)

答案 2 :(得分:2)

就个人而言,如果没有上下文管理器,我永远不会打开文件:

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

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