我知道
with open(my_file, 'r') as f:
pass
打开和关闭文件。还有,
f = open(my_file, 'r'); f.close()
做同样的事。
这个怎么样:
open(my_file, 'r')
我实际的问题案例是这样的:
import json;
json.load(open(my_file, 'r'))
对比
import json;
with open(my_file, 'r') as f:
j = json.load(f)
我想从技术上讲,文件应该保持打开状态,但我很确定由于文件对象未分配,它会立即被 Python 的垃圾收集器关闭。
- 我说得对吗?
- 这是一个好的做法吗?
- 这里的 Python 版本之间有什么区别吗?
请您参考如下方法:
I'm pretty sure that since the file object was not assigned, it was closed right away.
在 CPython 实现中,一旦引用计数减少到零,open 返回的对象将被删除。这与垃圾收集器无关,即使关闭 GC 也会发生。在 json.load(open(my_file, 'r')) 的情况下,文件句柄将立即关闭,因为退出 json.load 的主体将释放唯一引用。
Is this a good practice?
没有。它依赖于 CPython 的实现细节,文件句柄将被及时关闭。这是一种“代码味道”,阅读您的代码的人可能会认为您是一个草率的程序员。使用 with 语句来确保关闭的时间是明确的。如果您只是喜欢单行代码的外观,那么您可以使用 pathlib,如下所示:
json.loads(Path(my_file).read_text())
Any difference between Python versions here?
没有。
