Python Glom处理或跳过具有不同密钥的数据的PathError?
我正在使用glom包帮助遍历一本大词典 鉴于这些数据:Python Glom处理或跳过具有不同密钥的数据的PathError?,python,python-3.x,glom,Python,Python 3.x,Glom,我正在使用glom包帮助遍历一本大词典 鉴于这些数据: data = { 'groups': [ {'instance': {'name': 'football'}}, {'instance': {'name': 'rugby'}}, {'id': 145, 'type': 'unknown'}, ] } 使用glom,我尝试获取实例名称: import glom instance_names = glom(data, ('gro
data = {
'groups': [
{'instance': {'name': 'football'}},
{'instance': {'name': 'rugby'}},
{'id': 145, 'type': 'unknown'},
]
}
使用glom,我尝试获取实例名称:
import glom
instance_names = glom(data, ('groups', ['instance.name']))
我收到一个错误:
glom.core.PathAccessError: could not access 'instance', part 0 of Path('instance', 'name'), got error: KeyError('instance')
如何跳过实例
键不存在的对象
更新
我已尝试跳过异常,但随后收到空结果:
instance_names = glom(data, ('groups', ['instance.name']), skip_exc=PathAccessError)
根据API的文件
default(object)
–在
引发由跳过exc
指定的异常
skip_exc
(例外)–一个
可选异常或异常元组以忽略并返回default
(None
如果省略)。如果未设置skip_exc
和default,则glom
所以
当遇到异常时,将返回默认值(None
)。下面是解释这一点的源代码的摘要
default = kwargs.pop('default', None if 'skip_exc' in kwargs else _MISSING)
skip_exc = kwargs.pop('skip_exc', () if default is _MISSING else GlomError)
...
...
try:
ret = _glom(target, spec, scope)
except skip_exc:
if default is _MISSING:
raise
ret = default
这里有一种方法可以解决这个问题
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:21:23) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from glom import glom, SKIP
>>>
>>> data = {
... 'groups': [
... {'instance': {'name': 'football'}},
... {'instance': {'name': 'rugby'}},
... {'id': 145, 'type': 'unknown'},
... ]
... }
>>>
>>> instance_names = glom(data, ('groups', [lambda x: glom(x, 'instance.name', default=SKIP)]))
>>> print(instance_names)
['football', 'rugby']
可以从函数返回或通过文本包含,以取消对输出对象的赋值。根据API文档
default(object)
–在
引发由跳过exc
指定的异常
skip_exc
(例外)–一个
可选异常或异常元组以忽略并返回default
(None
如果省略)。如果未设置skip_exc
和default,则glom
所以
当遇到异常时,将返回默认值(None
)。下面是解释这一点的源代码的摘要
default = kwargs.pop('default', None if 'skip_exc' in kwargs else _MISSING)
skip_exc = kwargs.pop('skip_exc', () if default is _MISSING else GlomError)
...
...
try:
ret = _glom(target, spec, scope)
except skip_exc:
if default is _MISSING:
raise
ret = default
这里有一种方法可以解决这个问题
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:21:23) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from glom import glom, SKIP
>>>
>>> data = {
... 'groups': [
... {'instance': {'name': 'football'}},
... {'instance': {'name': 'rugby'}},
... {'id': 145, 'type': 'unknown'},
... ]
... }
>>>
>>> instance_names = glom(data, ('groups', [lambda x: glom(x, 'instance.name', default=SKIP)]))
>>> print(instance_names)
['football', 'rugby']
可以从函数返回或通过文本包含以取消对输出对象的赋值。仅通过
yaql
这可以通过:$.groups实现。其中($.containsKey(“实例”)
仅通过yaql
这可以通过:$.groups.where($.containsKey(“实例”)实现)