【问题标题】:What happens if I read a file without closing it afterwards?如果我读取文件后没有关闭它会发生什么?
【发布时间】:2013-07-22 07:16:26
【问题描述】:

我曾经读过这样的文件:

f = [i.strip("\n") for i in open("filename.txt")]

效果很好。我更喜欢这种方式,因为它比 Web 上提供的传统文件读取代码示例更简洁、更短(例如 f = open(...) ,for line in f.readlines() , f.close())。

但是,我想知道读取这样的文件是否有任何缺点,例如因为我没有关闭文件,Python解释器自己处理这个吗?使用这种方法有什么需要注意的地方吗?

【问题讨论】:

  • 抱歉标题不好顺便说一句,如果英语更好的人可以解决它,我将不胜感激:)

标签: python file-io


【解决方案1】:

这是推荐的方式:

with open("filename.txt") as f:
    lines = [line.strip("\n") for line in f]

另一种方式可能很长时间无法关闭输入文件。这对您的应用程序可能无关紧要。

with 语句负责为您关闭文件。在 CPython 中,只是让文件句柄对象被垃圾收集应该为您关闭文件,但在其他类型的 Python(Jython、IronPython、PyPy)中,您绝对不能指望这一点。此外,with 声明使您的意图非常明确,符合惯例。

【讨论】:

  • 感谢您的回答。顺便说一句,既然你说“推荐方式”;我在哪里可以找到/阅读关于在 Python 中做某​​事的推荐方法是什么?
  • 有些书不仅教 Python,还教 Python 社区的常用习语以及为什么使用它们。如果您已经了解 Python,您可以查找只讨论 Python 习语的网页……这是我最喜欢的:python.net/~goodger/projects/pycon/2007/idiomatic/handout.html(但“像 Pythonista 一样的代码”可以追溯到 2006 年左右,所以它没有提到 @987654325 @ 陈述)。此外,如果您在 StackOverflow 上阅读了一些问题和答案,像我这样的人会推荐这些习语。 :-)
  • 我使用 Python 已经有几年了,但我不知道大多数这些成语(我实际上没有读过任何 Python 书籍,也许这就是原因):( 这个链接看起来很棒,非常感谢!
【解决方案2】:

来自docs

当你完成一个文件时,调用 f.close() 来关闭它并释放所有被打开的文件占用的系统资源。

您应该始终在使用文件后关闭它。 Python 不会自动为你做这件事。如果您想要更简洁、更简洁的方式,请使用with 声明:

with open("filename.txt") as myfile:
    lines = [i.strip("\n") for i in myfile]

这有两个好处:

  • with块之后自动关闭文件

  • 如果引发异常,则无论如何都会关闭文件。

【讨论】:

    【解决方案3】:

    可能在少数情况下没问题,例如临时测试。 Python 只会在完成执行后关闭文件句柄。 因此,这种方法不适用于正确的应用程序。

    【讨论】:

      【解决方案4】:

      当我们使用任何写入函数写入文件时。 Python 将要写入文件的所有内容保存在缓冲区中,并将其推送到存储设备上的实际文件中,无论是在 Python 文件的末尾还是遇到close() 函数时。

      因此,如果文件在两者之间终止,则数据不会存储在文件中。所以我建议两个选择:

      • 使用with,因为一旦您退出该块或遇到任何异常,它就会关闭文件,

           with open(filename , file_mode) as file_object:
                   do the file manipulations........
        
      • 如果你想强制 python 将缓冲区的内容写入存储而不关闭文件,你可以使用flush() 函数。

        file_object.flush()
        

      供参考:https://lerner.co.il/2015/01/18/dont-use-python-close-files-answer-depends/

      【讨论】:

        猜你喜欢
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 2011-02-26
        • 2020-04-29
        • 2016-09-14
        • 1970-01-01
        • 2017-08-20
        相关资源
        最近更新 更多