【问题标题】:Close a file when creating a list from open() [duplicate]从 open() 创建列表时关闭文件 [重复]
【发布时间】:2013-07-26 19:34:23
【问题描述】:

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

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

问题是,我如何close 文件?

幕后发生了什么?

我在书中找不到此信息。

【问题讨论】:

  • 因为没有指向打开文件句柄的指针,我认为它只是在下一次传递时进行垃圾收集......

标签: python file list


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 呵呵,3个相同的答案同时出现。不过,这是其中最好的。
  • 这是最好的 :) 它实际上解释了它是 gc'd ...并且在 cython 中几乎是即时的
  • 感谢您对CPython 的洞察。太糟糕了find a duplicate运动现在这么快!我想知道如果再快一点,我会丢失哪些有趣的信息:D。
【解决方案2】:

来自doc:

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

你可以这样使用它:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 打开阅读不会锁定文件。同样使用 cython list(open(...)) 将几乎立即对 FH 进行垃圾收集。像你所说的那样做list(open(...)) 这样的事情并不是什么大罪……(+1 都是一样的,因为 contextmanager 是更好的形式)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    相关资源
    最近更新 更多