glom模块的使用(一)

glom模块的使用

简单说下glom模块主要是处理结构化数据用的,安装pip install glom即可,下面就glom的方法参数做例子讲解。

 

glom

和模块同名的glom方法使用方法:

.glom(target, spec, **kwargs)
  target参数是结构化数据,一般是json嵌套类型。
  spec参数是定义模板
  **kwargs包含键值类型的参数:default,skip_exc,scope

 

 

我们来看个简单的例子

target = {'a': {'b':{'c':{'d':{'e':[1,2,3,4,5,6,7]}}}}}
spec = 'a.b.c.d.e'
output = glom(target, spec)
print(output)
#输出[1, 2, 3, 4, 5, 6, 7]

我们尝试下更多玩法:

target = {'a': {'b':{'c':{'d':{'e':[1,2,3,4,5,6,7]}}}}}
spec = {'aa':'a.b.c.d.e'}
output = glom(target, spec)
print(output)
#输出{'aa': [1, 2, 3, 4, 5, 6, 7]}

target2 = {'a': {'b':{'c':[{'d':[1,2,3,4]},{'d':[4,5,6,7]}]}}}
spec2 = {'test':('a.b.c',['d'])}
#spec2 = {'test': ('a.b.c', [glom.Coalesce('e','d','f')])} #如果列表套字典的值键不都是‘d’,就需要用到Coalesce
output2=glom(target2, spec2) #注意看,第一层的是是一个元组,这边的这个d值必须是[]包起来的而不能只是字符串d
 print(output2) #输出{'test': [[1, 2, 3, 4], [4, 5, 6, 7]]}

 

再来一个官方的例子,综合运用一下:

target = {'system': {'planets': [{'name': 'earth', 'moons': 1},
                                 {'name': 'jupiter', 'moons': 69}]}}

spec = {'names': ('system.planets', ['name']),
            'moons': ('system.planets', ['moons'])}
输出:{'moons': [1, 69], 'names': ['earth', 'jupiter']}

通过上面的一些例子可以看出,spec基础用法就是''里面依次写键名.键名.键名.键名

另外需要注意的一点,如果列表里有字典取其值的话要求是键名必须相同就上面的'd'键,如果不是形同的建,就需要用的

可以看出glom和json的取得相比省去了很多的[].使用方便,另外spec的表达式还支持运用表达式比如lambda。
再来看一个运用参数比较全的例子

target = {'a': [0, 1, 2]} #给定一个结构化数据
spec = {'a': ('a', [lambda x:x/x])}#获取a的值里面元素的每个元素除以本身的值。
output = glom(target, spec,default='666',skip_exc=ZeroDivisionError)
print(output)
#输出666

 

上面的结果主要演示的是spec的高级用法和第三个参数的用法。上面计算0/0的时候报错,错误类型ZeroDivisionError,所以我们让ZeroDivisionError跳过了错误,同时配合default给定一个错误时的默认值。

但是如果出现下面的情况怎么办呢?

t={'a': {'b.c':{'c':{'d':{'e':[1,2,3,4,5,6,7]}}}}}
s= {'aa':'a.b.c.c'}
print(glom(t,s))

 

接下来让我们看Path方法

Path

glom.Path(*path_parts)
  Path objects specify explicit paths when the default 'a.b.c'-style general access syntax won’t work or isn’t desirable. 
Use this to wrap ints, datetimes, and other valid keys, as well as strings with dots that shouldn’t be expanded,下面具体的看例子。

 

 

from glom import glom,Path
target2 = {'a': {'b':{'c':[{'d':[1,2,3,4]},{'d':[4,5,6,7]}],'w':{'3.c':'e'}}}}
output2_1=Path(glom(target2,Path('a','b','w','3.c')))
print(output2_1)
#输出e

然后我们回过头来看看上面使用spec的方式时出现的错误

t={'a': {'b.c':{'c':{'d':{'e':[1,2,3,4,5,6,7]}}}}}
print(glom(t,{'aa':Path('a','b.c','c')}))
#输出{'aa': {'d': {'e': [1, 2, 3, 4, 5, 6, 7]}}}

注意点:

1.path的路径的层次关系必须是紧挨着。比如上面我是直接Path('a','c')就会报错了。
2.path不能取类似下面这种的列表里的键需要配合glom处理。
Path('system','planets','name')或者Path('system','planets',['name'])都不行。

target = {'system': {'planets': [{'name': 'earth', 'moons': 1},
                                 {'name': 'jupiter', 'moons': 69}]}}

 深层嵌套字典

官网一个多层嵌套字典的例子:

target8 = {
    'system': {
        'planets': [
            {
                'name': 'earth',
                'moons': [
                    {'name': 'luna'}
                ]
            },
            {
                'name': 'jupiter',
                'moons': [
                    {'name': 'io'},
                    {'name': 'europa'}
                ]
            }
        ]
    }
}

spec8 = {
    "planet_name": ('system.planets', ['name']),
    "moon_name": ('system.planets', [('moons', ['name'])])  #说白了,只要取得值是是一个list,对应的就应该用[]把取的值包起来
}

output8 = glom.glom(target8, spec8)
print(output8)
## 结果 {'planet_name': ['earth', 'jupiter'], 'moon_name': [['luna'], ['io', 'europa']]}

 

转自:https://www.cnblogs.com/c-x-a/p/9263401.html

posted @ 2020-12-06 23:16  阿布_alone  阅读(244)  评论(0编辑  收藏  举报
TOP