Python 应该将json.load()或json.dump()与open()上下文管理器一起使用吗?

Python 应该将json.load()或json.dump()与open()上下文管理器一起使用吗?,python,json,file,contextmanager,Python,Json,File,Contextmanager,例如,假设我们正在检查一个preferences.json文件,其中包含 首选项.json { “背景颜色”:“红色” } 然后,我们使用Python读取/修改/写入首选项。以下两个示例的功能相同,只是一个使用open()上下文管理器,另一个不使用 用CM.py更改前缀 导入json #加载用户首选项 将open('preferences.json')作为prefs_文件: prefs=json.load(prefs_文件) 打印(首选[背景颜色])#打印“红色” #将用户的背景颜色首选项更改

例如,假设我们正在检查一个
preferences.json
文件,其中包含

首选项.json
{
“背景颜色”:“红色”
}
然后,我们使用Python读取/修改/写入首选项。以下两个示例的功能相同,只是一个使用
open()
上下文管理器,另一个不使用

用CM.py更改前缀
导入json
#加载用户首选项
将open('preferences.json')作为prefs_文件:
prefs=json.load(prefs_文件)
打印(首选[背景颜色])#打印“红色”
#将用户的背景颜色首选项更改为蓝色
prefs['background_color']='blue'
#保存用户首选项
将open('preferences.json','w')作为prefs_文件:
dump(prefs,prefs_文件)
在不使用CM.py的情况下更改前缀
导入json
#加载用户首选项
prefs=json.load(打开('preferences.json'))
打印(首选[背景颜色])#打印“红色”
#将用户的背景颜色首选项更改为蓝色
prefs['background_color']='blue'
#保存用户首选项
prefs=json.dump(prefs,open('preferences.json','w'))
对于正常的文件读/写,我总是使用上下文管理器,并处理上下文管理器内的所有逻辑。但在本例中,文件的使用时间刚好足以填充dict或将dict写入文件。因此,不使用上下文管理器的示例对我来说似乎更清晰。我担心由于文件是以“匿名”方式打开的,因此没有任何东西可以调用
close()
,我不知道json模块是否在内部使用上下文管理器来处理这一问题,或者我是否只需要这样做。我确信使用上下文管理器以防万一是安全的方法,但同时我想知道json模块如何处理文件描述符()

我一直在寻找json模块的源代码,但在搜索了“dump”和“load”之后,什么也没找到,我不知道接下来要检查什么。我对C语言还不够精通,无法理解其中的内容。

这两种语言都是安全的,但使用上下文管理器的版本是更好的实践。 请记住,当程序退出时,所有写操作都会被刷新。这就是说,上下文管理器会立即导致关闭和刷新,而不是在垃圾收集和退出时。因此,它更加明确,并且将确保即使在程序末尾添加了更多(可能是长时间运行的)代码,事情也会立即生效

也就是说,试着让你的写作真正具有原子性。
这里仍然有一个窗口,其中文件已被打开以进行输出,但尚未刷新新内容;如果电源被切断,或者你有一个SIGKILL,或者一个读卡器试图把文件的内容拉到窗口中,你就会丢失数据。看见就个人而言,我赞成使用专门构建的库的建议,该库应了解各种平台的习惯用法和最佳实践。

BTW,您对重新命名是否公平/准确有何看法?这是“如果程序在写入后立即退出,是否需要上下文管理器强制关闭()?”?我认为,这是一个更好地向编写短期程序的Python开发人员的更广泛受众传达问题的标题——问题的内容并不是JSON特有的(即它是
JSON.write(prefs,prefs_文件)
编写vs
prefs_文件.write(“无论什么”)
实际上对于是否/何时保证发生冲水并不重要。@charlesduff我的意思是,它可以重新命名。但问题的最初目的是了解Python内置如何处理文件描述符,以及json模块之类的东西是否自己处理它,或者我是否仍然需要使用上下文管理器,即使对于小的读/写操作也是如此。密切相关: