【问题标题】:python close file descriptor questionpython关闭文件描述符问题
【发布时间】:2011-06-03 18:05:06
【问题描述】:

我认为这个问题更多的是“编码风格”而不是技术问题。

说我有一行代码:

buf = open('test.txt','r').readlines()
...

文件描述符会自动关闭,还是留在内存中? 如果文件描述符没有关闭,关闭它的首选方法是什么?

【问题讨论】:

    标签: python file-io coding-style


    【解决方案1】:

    如果将文件对象分配给变量,则可以使用.close() 显式关闭它

    f = open('test.txt','r')
    buf = f.readlines()
    f.close()
    

    或者(更普遍地首选),您可以使用Python docs 中提到的with 关键字(Python 2.5 和更高版本):

    最好使用with 处理文件时的关键字 对象。这样做的好处是 文件在完成后正确关闭 套件完成,即使出现异常 在途中提出。也是很多 比写作短 try-finally 块:

    >>> with open('test.txt','r') as f:
    ...     buf = f.readlines()
    >>> f.closed
    True
    

    【讨论】:

    • "buf" 在这种情况下将是一个列表 - 没有“关闭”方法。
    • with 在 2.5 中可用,但您需要使用 from __future__ import with_statement 导入它。从 2.6 开始,这不是必需的。
    • @jsbueno 感谢您发现我的错误!我更新了答案以反映您的观察! @Jay Conrod,感谢您提供的信息! (我从 2.4 跳到 2.7,所以我从来没有经历过!)
    【解决方案2】:

    通常在 CPython 中,当引用计数降至零时,文件会立即关闭(尽管未来版本的 CPython 不保证这种行为)

    在其他实现中,例如 Jython,文件在被垃圾回收之前不会关闭,这可能需要很长时间。

    根据实现的行为不同,代码的工作方式不同,这是一种糟糕的风格。

    如果它只是用于快速脚本或您在解释器外壳中尝试的东西,那就足够了,但对于任何类型的生产工作,您通常应该使用上下文管理器,如 Falmarri 的回答中所述

    【讨论】:

    • 在不同的 Python 实现中对编码器造成影响的一个例子是,Mercurial 在 PyPy 上运行时会耗尽操作系统允许的打开文件的数量。 Mercurial 正在进行更改以解决此问题。
    【解决方案3】:

    它将一直保留在内存中,直到垃圾收集器将其关闭。您应该始终明确关闭文件描述符。只需执行以下操作:

    with open('test.txt', 'r') as f:
        buf = f.readlines()
    

    【讨论】:

    • @Hugh Bothwell:嗯。我想这取决于您对明确的定义。我会称它为明确关闭它。
    • 它更加明确,因为我们现在确切地知道文件何时关闭,但这并不是我在编程意义上所说的明确。
    • 我会称之为自动关闭文件句柄
    【解决方案4】:

    它会自动关闭,但具体时间取决于实现。显式使用 with 块会更好,但如果您只是为自己编写一个偶尔运行的小脚本,这并不重要。

    【讨论】:

    • 脚本大小和运行频率完全无关。如果脚本遍历打开它们的许多文件,那么它是否不关闭它们确实很重要。迟早它会用完句柄并崩溃。
    • 你是对的,我错过了重要的部分:那是为了他自己,偶尔。因为那样,当他用完文件句柄时,他会注意到。 ;) 但是如果他把它放在客户网站上。 :-/
    【解决方案5】:

    您也可以尝试使用 os.close(fd) 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 2017-08-22
      相关资源
      最近更新 更多