在this question关于python单行的评论中,我发现我不知道python如何处理匿名文件对象。从问题:
open(to_file, 'w').write(open(from_file).read())
open
有两次调用而不使用with
关键字(通常是我处理文件的方式)。在过去,我使用过这种未命名的文件。 IIRC,该文件似乎有一个剩余的操作系统级锁定,将在一两分钟后过期。
那么这些文件句柄会发生什么?它们是通过垃圾收集清理的吗?通过操作系统?调用close()
时,Python机器和文件会发生什么情况,当脚本完成并经过一段时间后,它是否会发生?
答案 0 :(得分:4)
监控Linux上的文件描述符(通过检查/ proc / $$ / fds)和Windows上的文件句柄(使用SysInternals工具),看起来该文件在语句后立即关闭。
然而,由于垃圾收集器必须执行,因此无法保证这一点。在我完成的测试中,它每次都会立即关闭。
建议with
语句与open
一起使用,但实际需要的情况很少见。很难演示必须使用with
的情况,但安全可能是个好主意。
所以你的单行成为:
with open(to_file, 'w') as tof, open(from_file) as fof:
tof.write(fof.read())
with
的优点是可以保证调用名为__exit__()
的特殊方法(在io类中)。
*除非您执行os._exit()
。
答案 1 :(得分:1)
文件将在垃圾收集器收集后关闭,CPython会立即收集它们,因为它使用引用计数,但这不是一种保证行为。
如果您在循环中使用文件而不关闭它们,则可能会用完文件描述符,这就是为什么建议使用with语句的原因(如果您使用的是2.5,则可以使用from __future__ import with_statement
)。