当前位置: 首页 > 面试题库 >

读取整个文件是否会使文件句柄保持打开状态?

蒋高超
2023-03-14
问题内容

如果您读取整个文件时content = open('Path/to/file', 'r').read(),文件句柄是否一直打开直到脚本退出?有没有更简洁的方法来读取整个文件?


问题答案:

这个问题的答案在某种程度上取决于特定的Python实现。

要了解所有内容,请特别注意实际file对象。在您的代码中,该对象仅在表达式中被提及一次,并且在read()调用返回后立即变得不可访问。

这意味着文件对象是垃圾。剩下的唯一问题是“垃圾收集器何时收集文件对象?”。

在使用引用计数器的CPython中,这种垃圾立即被注意到,因此将立即被收集。这通常不适用于其他python实现。

确保该文件已关闭的一种更好的解决方案是以下模式:

with open('Path/to/file', 'r') as content_file:
    content = content_file.read()

块结束后,它将始终立即关闭文件;即使发生异常。

编辑:在上面提出一个更好的点:

除了file.__exit__(),这是在with上下文管理器设置中“自动”调用的,唯一file.close()可以自动调用的其他方式(即,除了自己明确调用之外)是via
file.__del__()。这就引出了我们什么时候__del__()打电话的问题?

正确编写的程序不能假定终结器将在程序终止之前的任何时候运行。

-
https://devblogs.microsoft.com/oldnewthing/20100809-00/?p=13203

特别是:

从不显式销毁对象。但是,当它们变得不可访问时,它们可能会被垃圾回收。 允许实现推迟垃圾回收或完全忽略垃圾回收
–只要没有收集仍可到达的对象,垃圾回收的实现方式就取决于实现质量。

[…]

CPython当前使用带有循环计数垃圾的(可选)延迟检测的引用计数方案,该方案会在无法访问时立即收集大多数对象,但不能保证收集包含循环引用的垃圾。

- https://docs.python.org/3.5/reference/datamodel.html#objects-values-and-
types

(强调我的)

但正如它暗示的那样,其他实现可能具有其他行为。例如,PyPy有 6
种不同的垃圾回收实现!



 类似资料:
  • 问题内容: 我正在开发一个巨大的旧版Java应用程序,其中包含许多手写内容,如今您可以让一个框架来处理。 我现在面临的问题是,我们的Solaris Server上的文件句柄用尽了。我想知道跟踪打开文件句柄的最佳方法是什么?在哪里查看,什么会导致打开的文件句柄用尽? 我不能在Solaris下调试应用程序,只能在Windows开发环境上调试。分析Windows下的打开文件句柄是否甚至合理? 问题答案:

  • 问题内容: 我正在尝试使小程序以非常频繁的时间间隔(每秒几次)读取本地文件系统(用户计算机)上的文件,然后通过javascript将文件的内容提供给网页。 小程序需要读取的文件由用户计算机上的程序进行高频更新。我担心的是,如果小程序在文件正在更新的过程中从文件中读取数据,可能会发生什么。 我不知道这有多大可能,但是如果确实有问题,有没有办法在读取文件之前确保当前未将其写入文件? 问题答案: 我对此

  • 问题内容: 我已经提交了类似的问题,但已将问题分解为最简单的形式,因此我将其再次发布: 问题是,如果我多次添加同一文件,SolrJ似乎会使文件句柄保持打开状态。 我使用以下方法向Solr提交文档: 而这种删除文件的方法: 但这似乎留有一些文件句柄: 以下代码段演示了该问题: 如果我两次添加相同的文档,SolrJ会以某种方式使这些句柄保持活动状态,并且添加的文档无法被任何其他进程修改。 我已经尝试调

  • . 而不是这样,发生的是: 第一次调用之前:#empty#empty#

  • 问题内容: 我有一个必须运行许多模拟运行的应用程序。我想设置一个日志记录机制,其中所有日志记录都记录在general.log中,而所有用于模拟运行的日志都进入run00001.log,…。为此,我定义了一个Run类。在新的文件句柄中添加了运行日志。 问题在于,运行的日志文件永远不会释放,因此在运行了许多次之后,可用的句柄就用光了,运行崩溃了。 我已经设置了一些例程来测试它,如下所示 主程序 类Ru

  • 问题内容: 我有一个脚本读取文件,然后根据该文件完成测试,但是我遇到了一个问题,因为一个小时后文件会重新加载,并且无法在该时间点或之后重新读取该脚本。 所以: 获取要读取的新文件 读取文件 执行文件测试 获取要读取的新文件(具有相同的名称-但如果它是解决方案的一部分,则可以更改) 读取新文件 对新文件执行相同的测试 谁能建议一种使Python重新读取文件的方法? 问题答案: 要么到文件开头 或再次