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':[,,,,,,]}}}}}
spec = 'a.b.c.d.e'
output = glom(target, spec)
print(output)
#输出[, , , , , , ]

我们尝试下更多玩法:

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='',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}]}}

Literal

class glom.Literal(value)

glom模块的使用(一)的更多相关文章

  1. glom模块的使用(二)

    上次我们说到golm的简单应用这次我们继续带结构化数据的其他操作进行学习. Literal 用法:class glom.Literal(value) 这个方法的功能主要是添加自定义的键值. 例如: f ...

  2. 一个python爬虫工具类

    写了一个爬虫工具类. # -*- coding: utf-8 -*- # @Time : 2018/8/7 16:29 # @Author : cxa # @File : utils.py # @So ...

  3. npm 私有模块的管理使用

    你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...

  4. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  5. ES6模块import细节

    写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...

  6. Python标准模块--ContextManager

    1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...

  7. Python标准模块--Unicode

    1 模块简介 Python 3中最大的变化之一就是删除了Unicode类型.在Python 2中,有str类型和unicode类型,例如, Python 2.7.6 (default, Oct 26 ...

  8. Python标准模块--Iterators和Generators

    1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到.在本篇博文中,我们将会学习迭代器和生成器是什么.当然 ...

  9. 自己实现一个javascript事件模块

    nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...

随机推荐

  1. Codeforces 498B Name That Tune

    不想说啥了…这是我被卡常数卡得最惨的一次… 首先根据期望的线性性,我们考虑每首歌能够被认出来的概率,也就是每首歌对答案贡献的期望.那么定义F[i]为第i首歌被认出来的概率是做不了的,自然想到F[i][ ...

  2. sql批量更新关系型数据库

    更改gb_groupd里的chargingrulesname的值UPDATE   tb_group SET tb_group.chargingrulesname =tb_chargingrules.c ...

  3. 判断form表单每个input字段是否有内容

    //---------------------------------------------------input失去焦点时判断是否有值 btn_click: function () { //inp ...

  4. Oracle数据库中心双活之道:ASM vs VPLEX

    Oracle数据库中心双活之道:ASM vs VPLEX 来源 https://www.cnblogs.com/wenjiewang/p/7460212.html 双活方案对比:ASM vs V-PL ...

  5. 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出

    安装微软的windows补丁 KB2781514 ,补丁主要解决“在 .NET Framework 4.5 更新之后,Visual Studio 用户可能无法打开或创建 C++ 或 JavaScrip ...

  6. [luogu5048] [Ynoi2019模拟赛] Yuno loves sqrt technology III

    题目链接 洛谷. Solution 思路同[BZOJ2724] [Violet 6]蒲公英,只不过由于lxl过于毒瘤,我们有一些更巧妙的操作. 首先还是预处理\(f[l][r]\)表示\(l\sim ...

  7. BZOJ2111:[ZJOI2010]排列计数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2111 https://www.luogu.org/problemnew/show/P2606#su ...

  8. BZOJ2597 [Wc2007]剪刀石头布 【费用流】

    题目链接 BZOJ2597 题解 orz思维差 既然是一张竞赛图,我们选出任意三个点都可能成环 总方案数为 \[{n \choose 3}\] 如果三个点不成环,会发现它们的度数是确定的,入度分别为\ ...

  9. HDU.2647 Reward(拓扑排序 TopSort)

    HDU.2647 Reward(拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 这道题有一点变化是要求计算最后的金钱数.最少金钱值是888,最少的 ...

  10. BZOJ1832 聚会

    Description:Y岛风景美丽宜人,气候温和,物产丰富.Y岛上有N个城市,有N-1条城市间的道路连接着它们.每一条道路都连接某两个城市.幸运的是,小可可通过这些道路可以走遍Y岛的所有城市.神奇的 ...