【发布时间】:2013-07-26 19:34:23
【问题描述】:
【问题讨论】:
-
因为没有指向打开文件句柄的指针,我认为它只是在下一次传递时进行垃圾收集......
【问题讨论】:
当文件的对象被垃圾回收时,文件将被关闭。在 CPython 中,这几乎在该行执行后立即发生,因为该文件从未分配给变量。在其他 Python 中,例如 Jython 或 IronPython,这可能不会立即发生(或根本不会发生),尽管所有打开的文件在进程退出时总是关闭。
因此,更好的方法是使用 'with' 显式关闭文件:
with open("strcpy.c") as infile:
l = list(infile)
这样做的一个好处是,即使在读取文件时发生异常,文件也会被正确关闭;对于这种情况,您不必使用 try/except 块手动编写代码。
with 语句可以写在一行,如果你想坚持简洁的单行。 :-)
也就是说,我自己有时会在短期运行的脚本中使用这个习惯用法,在这种情况下,让文件打开的时间比严格要求的时间长一点并不是什么大问题。一个优点是您不会用指向已关闭文件的变量(在本例中为 infile)来搞乱事情。
【讨论】:
CPython 的洞察。太糟糕了find a duplicate运动现在这么快!我想知道如果再快一点,我会丢失哪些有趣的信息:D。
来自doc:
处理文件时最好使用 with 关键字 对象。这样做的好处是文件在之后正确关闭 它的套件完成了,即使在途中引发了异常。
你可以这样使用它:
with open('strcpy.c') as f:
l = list(f)
【讨论】:
就个人而言,我从不在没有上下文管理器的情况下打开文件:
with open('strcpy.c') as myfile:
l = list(myfile)
# do stuff with l here
使用上下文管理器时,文件在缩进块的末尾自动关闭。
【讨论】:
list(open(...)) 将几乎立即对 FH 进行垃圾收集。像你所说的那样做list(open(...)) 这样的事情并不是什么大罪……(+1 都是一样的,因为 contextmanager 是更好的形式)