在Python中读取整个文件

问题:

如果您使用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.__exit__()file.close()自动调用的唯一其他方法(即,除了自己明确地调用它之外)通过file.__del__()。这引起了我们何时__del__()被调用的问题?

正确写入的程序不能假定终结者将在程序终止之前的任何时刻运行。

http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx
尤其是:

对象从未被明确地销毁;然而,当它们变得不可达时,它们可能被垃圾收集。 一个实现被允许推迟垃圾回收或完全省略 – 只要没有收集到仍然可以访问的对象,就是实现垃圾回收的实现质量问题。
[…]
CPython目前使用引用计数方案(循环链接垃圾)(可选)延迟检测,一旦它们变得不可访问,它们就收集大多数对象,但不能保证收集包含循环引用的垃圾。

https://docs.python.org/3.5/reference/datamodel.html#objects-values-and-types
(重点是我的)
但是正如它所暗示的,其他实现可能有其他行为。例如,PyPy has 6 different garbage collection implementations

 
 
 
Code问答:       codewenda.com
Stackoverflow: Reading entire file in Python
本文链接: http://codewenda.com/%E5%9C%A8Python%E4%B8%AD%E8%AF%BB%E5%8F%96%E6%95%B4%E4%B8%AA%E6%96%87%E4%BB%B6

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 9 = 1