Skip to main content
 首页 » 编程设计

python之如果我打开文件而不分配它,文件是否会保持打开状态

2025年05月04日16thcjp

我知道

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 的垃圾收集器关闭。

  1. 我说得对吗?
  2. 这是一个好的做法吗?
  3. 这里的 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?

没有。