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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
2018-12-06 MySQL完整性约束
2018-12-06 MySQL基础数据类型
2018-12-06 mysql 存储引擎介绍
2018-12-06 day36 mysql 表的具体操作