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

tMC:

如果您读取整个文件时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种不同的垃圾回收实现

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

单独的open()是否会使文件句柄保持打开状态?

Python读取文本文件并保持打开状态

我如何找到有关系统进程保持打开状态的文件句柄的更多信息?

批处理文件:暂停不会使窗口保持打开状态

Windows资源管理器使可执行文件上的句柄保持打开状态

NodeJS:fs.appendFile是否使文件链接保持打开状态,以便追加操作更快?

Apache启动脚本使锁定文件保持打开状态

在Perl中检查文件是否处于打开状态

为什么HttpClient会使套接字保持打开状态?

保持文件句柄打开的弊端?

如果我打开文件而不分配文件,它会保持打开状态吗?

Assembly.LoadFrom是否保持打开文件句柄?

每次打开/关闭Python文件与保持打开状态直到完成该过程

如何从批处理文件启动Powershell命令行并强制其保持打开状态?

批处理文件:如何使控制台窗口保持打开状态

从保持打开状态的已删除文件中释放磁盘空间的最佳方法

PowerPoint 2013宏在关闭命令后保持文件锁定为打开状态

多个urwid呼叫获得终端大小,使文件保持打开状态

bat文件发出git pull命令并使git bash窗口保持打开状态

使批处理文件Cmd窗口保持打开状态X秒钟

CSV文件不会在python中保持打开状态

关闭文件后杀死在后台保持打开状态的 Excel 进程

交换空间是否使用真实RAM保持打开状态?

子流程是否使管道保持打开状态?

Android Studio:使项目文件树状态保持展开状态

比较两个文件时如何确保两个文件都保持打开状态

从 Word 中退出 Excel 工作簿会使 Excel 保持打开状态

如何遍历打开的文本文件并在发送电子邮件时保持打开状态?

将selenium设置为使用自定义配置文件,但默认情况下会保持打开状态