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. P1491 集合位置

    题目描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记得狗狗的枪法 ...

  2. JavaScript定义类与对象的一些方法

    最近偶然碰到有朋友问我"hoisting"的问题.即在js里所有变量的声明都是置顶的,而赋值则是在之后发生的.可以看看这个例子: 1 var a = 'global'; 2 (fu ...

  3. 背景建模技术(四):视频分析(VideoAnalysis)模块

    视频分析模块主要包含两个函数,一个是VideoAnalysis::setup(....),其主要功能就是确定测试的视频是视频文件或摄像头输入亦或是采用命令行参数:第二个函数是VideoAnalysis ...

  4. Educational Codeforces Round 60 (Rated for Div. 2) 题解

    Educational Codeforces Round 60 (Rated for Div. 2) 题目链接:https://codeforces.com/contest/1117 A. Best ...

  5. AndroidManifest Ambiguity方案原理及代码

    1简述 前段时间在bluebox的一份android安全pdf中看到一个AndroidManifest Ambiguity方案.该方案基于android系统解析AXML的一个特点:android在解析 ...

  6. html 5 新特性

    现在html 5技术是最新的html标准,掌握html 5已经变得非常重要,以下是我查看相关资料后对html 5 的新特性的总结,方便大家对比学习.html 5的新特性1.取消了一些过时的html 4 ...

  7. mysql 联合索引匹配原则

    读mysql文档有感 看了mysql关于索引的文档,网上有一些错误的博客文档,这里我自己记一下. 几个重要的概念 1.对于mysql来说,一条sql中,一个表无论其蕴含的索引有多少,但是有且只用一条. ...

  8. 【C++ STL】Queue

    1.定义 class queue<>实作为一个queue(也成为FIFO,先进先出).可以使用push()将任意数量的元素置入queue中,也可以使用pop()将元素以其插入顺序从容器中移 ...

  9. bzoj 1594: [Usaco2008 Jan]猜数游戏——二分+线段树

    Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面摆N(1 <= N<= 1,000,00 ...

  10. xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

    问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了.但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高.用RandomFore ...