Python数据解析模块之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'])} output2=glom(target2, spec2) 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}]}} 后续。。。
作者:cxapython
链接:https://juejin.cn/post/7023648030700077064