我在写一篇文章。它是两个应用程序之间的挂钩。问题是有一个应用程序已经更新,现在它使用yaml而不是json作为配置文件。你知道吗
import os
import yaml
import json
config = {
'version': "2.0.2",
'journals': {
"default": "/test/yaml/bhla"
},
'editor': os.getenv('VISUAL') or os.getenv('EDITOR') or "",
'encrypt': False,
'template': False,
'default_hour': 9,
'default_minute': 0,
'timeformat': "%Y-%m-%d %H:%M",
'tagsymbols': '@',
'highlight': True,
'linewrap': 79,
'indent_character': '|',
}
with open("jrnl.yaml", 'w') as f:
yaml.safe_dump(config, f, encoding='utf-8', allow_unicode=True, default_flow_style=False)
这将创建一个yaml文件,您将在其中运行代码。你知道吗
我首先编写了这个简单的补丁,以允许我的钩子同时使用json和yaml。你知道吗
JRNL_CONFIG_PATH = "jrnl.yaml"
with open(JRNL_CONFIG_PATH, "r") as f:
try:
JRNL_CONFIG = json.load(f)
except json.JSONDecodeError:
JRNL_CONFIG = yaml.load(f, Loader=yaml.FullLoader)
TAGS_SYMBOL = JRNL_CONFIG.get("tagsymbols", "@")
但令人惊讶的是,当捕捉到错误时,f
被关闭,因为JRNL_CONFIG
将返回None并产生以下错误:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-141-bc1ef847563b> in <module>()
----> 1 JRNL_CONFIG.get("tagsymbols", "@")
AttributeError: 'NoneType' object has no attribute 'get'
.json
,.yaml
)try:
f = open(JRNL_CONFIG_PATH, "r")
JRNL_CONFIG = json.load(f)
except json.JSONDecodeError:
f = open(JRNL_CONFIG_PATH, "r")
JRNL_CONFIG = yaml.load(f, Loader=yaml.FullLoader)
finally:
f.close()
问题1:为什么捕获异常会关闭打开的文件(有上下文和无上下文)?
被@jedwards
问题2:捕捉json错误并仍然能够将文件解析为yaml的最佳方法是什么?
被@chepner
无需同时尝试
json.load
和yaml.load
,因为YAML是JSON的超集,yaml.load
将解析json.load
可以解析的任何内容。你知道吗问题不是文件正在关闭(不是),而是当您尝试使用回退时,文件指针不再位于预期位置(文件的开头):
这里,^{} 方法返回文件指针的位置。你知道吗
一种解决方案是重置except块内的文件指针:
关于:
相关问题 更多 >
编程相关推荐