我知道打开文件的安全且推荐的方法是使用上下文管理器:
with open("x") as fh:
do_something_with(fh)
我经常遇到这样的情况,除了完全读取或写入文件然后关闭它之外,我不想对
open()
返回的文件句柄执行任何操作。关闭文件由上下文管理器自动处理。但如果我不使用怎么办?
比如说是这个吗
with open("x.pickle", "rb") as fh:
foo = pickle.load(fh)
more_code()
或多或少相当于这个?
foo = pickle.load(open("x.pickle", "rb"))
more_code()
假设pickle(或任何其他创建/使用文件的东西)没有以某种方式保留文件句柄,并让它超出范围,它最终应该被垃圾收集并关闭文件,对吗?
我通过在
sleep(100000)
之前插入 more_code()
来测试这个简单的示例,然后检查 lsof
以查看文件是否仍显示为打开状态。在本次测试中,情况并非如此。因此,再次假设无论读/写文件都会让文件句柄超出范围,这是一种安全的做法吗?
在 iobase 的 Python 实现中,您可以看到 IO 对象的垃圾收集 (
finalize
) 部分正在调用其 close
方法,并将属性 _finalizing
设置为 True。这个类是 TextIOBase
的超类。
当然,请注意,这是一个低级实现细节。我怀疑 Python 文档是否要求这样做。