python - 如果我打开文件而不分配文件,它会保持打开状态吗?
问题描述
我知道
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 版本有什么区别吗?
解决方案
我很确定,由于没有分配文件对象,它立即被关闭。
在 CPython 实现中,open
一旦引用计数减少到零,返回的对象将被删除。这与垃圾收集器无关,即使关闭 GC 也会发生。在文件句柄的情况下json.load(open(my_file, 'r'))
将立即关闭,因为退出主体json.load
将释放唯一的引用。
这是一个好习惯吗?
不会。文件句柄会及时关闭,这依赖于 CPython 的实现细节。这是一种“代码气味”,阅读您的代码的人可能会认为您是一个草率的程序员。使用该with
语句来确保关闭的时间是明确的。如果您只是喜欢单线的外观,那么您可以使用pathlib
,如下所示:
json.loads(Path(my_file).read_text())
这里的 Python 版本有什么区别吗?
不。
推荐阅读
- javascript - Amcharts 图表光标显示在最后一个位置
- json - 使用 jq 在深度嵌套的 JSON 中过滤对象的键
- javascript - Animejs: translateX 0 值不起作用
- android - 使用循环将多个视图添加到 RelativeLayout
- api - 如何在运输标签上添加有关货物危险的信息?
- git - Visual Studio 2017“连接到项目”显示错误的服务器存储库
- environment-variables - Electron - 重启应用程序/刷新环境变量
- reactjs - 在reactjs上创建带有左侧文本和右侧的图像/图标的按钮
- javascript - 有什么方法可以检测用户是否从本地存储中删除了任何项目
- excel - 包含字符串和数字的列到仅包含数字的列