3

我曾经读过这样的文件:

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

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

但是,我想知道读取这样的文件是否有任何缺点,例如,由于我没有关闭文件,Python 解释器是否会自行处理?使用这种方法有什么我应该注意的吗?

4

4 回答 4

3

这是推荐的方式:

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

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

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

于 2013-07-22T07:19:58.153 回答
1

文档

完成文件后,调用 f.close() 将其关闭并释放打开文件占用的所有系统资源。

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

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

这有两个优点:

  • with它在块后自动关闭文件

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

于 2013-07-22T07:21:06.650 回答
0

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

于 2013-07-22T07:26:38.327 回答
0

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

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

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

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

    file_object.flush()
    

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

于 2021-05-23T15:16:48.197 回答