【问题标题】:Why should I close files in Python? [duplicate]为什么要在 Python 中关闭文件? [复制]
【发布时间】:2014-09-24 02:29:23
【问题描述】:

通常,当我打开文件时,我从不调用close() 方法,也不会发生任何不好的事情。但有人告诉我这是不好的做法。这是为什么呢?

【问题讨论】:

  • 您可以打开的文件数量是有限制的——通常是 512-4096。如果您忽略关闭文件,您最终将无法打开新的文件描述符(文件、套接字等) 如果您正在爬取文件目录并进行操作,您很容易陷入这种情况每一个。但是,在大多数情况下,一旦文件描述符对象超出范围,它将自动关闭。但是,根据这种行为是草率的。

标签: python


【解决方案1】:

在大多数情况下,不关闭文件是个坏主意,原因如下:

  1. 它将您的程序置于垃圾收集器手中 - 尽管文件理论上会自动关闭,但它可能不会关闭。 Python 3 和 Cpython 通常在垃圾收集方面做得很好,但并非总是如此,其他变体通常很糟糕。

  2. 它会减慢您的程序。打开的东西太多,因此 RAM 中使用的空间更多,会影响性能。

  3. 在大多数情况下,python 中文件的许多更改直到文件关闭之后才会生效,因此如果您的脚本编辑、保持打开状态并读取文件,它不会看到编辑。

  4. 理论上,您可能会遇到可以打开多少文件的限制。

  5. 正如@sai 下面所述,Windows 将打开的文件视为已锁定,因此像 AV 扫描仪或其他 python 脚本这样的合法设备无法读取文件。

  6. 这是一种草率的编程(再说一遍,我自己也不是最擅长记住关闭文件!)

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    我最近遇到了一个问题: 我在 for 循环中将一些东西写入文件,但如果我用 ^C 中断脚本,则实际上应该写入文件的大量数据不存在。看起来 Python 无缘无故地停止写在那里。我在 for 循环之前打开了文件。然后我更改了代码,以便 Python 在单次循环中打开和关闭文件。

    基本上,如果您为自己编写东西并且没有任何问题 - 没关系,如果您为更多人而不只是自己编写东西 - 在代码中放置一个 close() ,因为有人可能会随机得到一个错误消息,您应该尝试防止这种情况发生。

    【讨论】:

      【解决方案3】:

      找到了一些好的答案:

      (1) 这是一个良好的编程习惯。如果你不关闭 它们自己,Python 最终会为你关闭它们。在一些 Python 的版本,那可能是它们不再是的那一刻 正在使用;在其他情况下,它可能不会在很长一段时间内发生。在下面 在某些情况下,它可能根本不会发生。

      (2) 写入文件时,数据可能不会写入磁盘,直到 该文件已关闭。当你说“output.write(...)”时,数据是 通常缓存在内存中,直到文件才打到硬盘 已经关闭。文件打开的时间越长, 您可能会丢失数据。

      (3) 由于您的操作系统对文件的数量有严格限制 把手可以随时保持打开状态,最好能进入 在不需要时关闭它们而不是等待的习惯 “女仆服务”帮你收拾干净。

      (4) 此外,某些操作系统(尤其是 Windows)将打开 文件为锁定和私有。当您打开文件时,没有其他文件 程序也可以打开它,甚至只是为了读取数据。这破坏了 备份程序、防病毒扫描程序等。

      http://python.6.x6.nabble.com/Tutor-Why-do-you-have-to-close-files-td4341928.html https://docs.python.org/2/tutorial/inputoutput.html

      【讨论】:

        【解决方案4】:

        打开的文件会占用资源并且可能会被锁定,从而阻止其他程序使用它们。无论如何,在读取文件时最好使用with,因为它会为您关闭文件。

        with open('file', 'r') as f:
           read_data = f.read()
        

        下面是一个示例,说明如果您让文件保持打开状态可能会发生“坏事”。 在 python 解释器中打开一个要写入的文件,向其中写入一个字符串,然后在文本编辑器中打开该文件。在我的系统上,文件将是空的,直到我关闭文件句柄。

        【讨论】:

        • 本身并不是一个好的做法。尽管很多人喜欢使用 with,但如何操作并不重要。
        【解决方案5】:

        您只需在写入文件时调用close()

        Python 大部分时间会自动关闭文件,但有时不会,因此您需要手动调用它以防万一。

        【讨论】:

        • 但是你应该关闭你打开的所有资源。问题是问为什么这是建议,而不是当你不得不。如果您正在练习不关闭只读资源,那么您最好阅读此处的其他答案。
        • 我确实关闭了只读资源。我试图解释为什么当你不关闭文件时(通常)不会发生任何不好的事情。
        【解决方案6】:

        文件对象的 close() 方法会刷新所有未写入的信息并关闭文件对象,之后就不能再进行写入了。

        当一个文件的引用对象被重新分配给另一个文件时,Python 会自动关闭一个文件。使用 close() 方法关闭文件是一个好习惯。Here is the link about the close() method。我希望这会有所帮助。

        【讨论】: