python glom模块的使用简介

盼什么没什么,怕什么来什么。那些忙于批评别人的人,都忘了检讨自己。生活就是这样,当你想昂着头走路时,你就得随时准备在地上趴着。

工欲善其事,必先利其器!我们想要更轻松更有效率地开发,必须学会一些“高级”技能。前不久看到一位 Python 高僧的代码,其中使用了一个短小精悍的模块,我认为还蛮有用的,今天分享给大家。

这个模块就叫 glom ,是 Python 处理数据的一个小模块,它具有如下特点:

  • 嵌套结构并基于路径访问
  • 使用轻量级的Pythonic规范进行声明性数据转换
  • 可读、有意义的错误信息
  • 内置数据探测和调试功能

看起来比较抽象,对不对?下面我们用实例来给大家演示一下。

安装

作为 Python 内置模块,相信你一定知道怎么安装:

pip3 install glom

几秒钟就搞定!

简单使用

我们来看看最简单的用法:

d={"a":{"b":{"c":1}}}
print(glom(d,"a.b.c"))#1

在这里,我们有一个嵌套三层的 json 结构,我们想获取最里层的 c 对应的值,正常的写法应该是:

print(d["a"]["b"]["c"])

如果到这里,我说 glom 比传统方式好一些,因为你不用一层层地写中括号和引号,你会不会嗤之以鼻?

好,我们再来看看下面的情况:

d={"a":{"b":None}}
print(d["a"]["b"]["c"])

遍历到一个 None 对象,你会收到下面的错误:

Traceback(mostrecentcalllast):
File"/Users/cxhuan/Documents/python_workspace/mypy/pmodules/pglom/glomstudy.py",line10,in<module>
print(d["a"]["b"]["c"])
TypeError:'NoneType'objectisnotsubscriptable

我们来看看 glom 的处理方式:

fromglomimportglom

d={"a":{"b":None}}
print(glom(d,"a.b.c"))

同样地,glom 不能把错误的输出成对的,你会得到以下错误:

Traceback(mostrecentcalllast):
File"/Users/cxhuan/Documents/python_workspace/mypy/pmodules/pglom/glomstudy.py",line11,in<module>
print(glom(d,"a.b.c"))
File"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/glom/core.py",line2181,inglom
raiseerr
glom.core.PathAccessError:errorraisedwhileprocessing,detailsbelow.
Target-spectrace(mostrecentlast):
-Target:{'a':{'b':None}}
-Spec:'a.b.c'
glom.core.PathAccessError:couldnotaccess'c',part2ofPath('a','b','c'),goterror:AttributeError("'NoneType'objecthasnoattribute'c'")

如果你仔细看报错内容,你就会发现这报错内容极其详细,一目了然,这对于找程序 bug 简直是神器!

复杂用法

刚才简单的例子,让大家对 glom 有了直观的认识,接下来我们看看 glom 的 glom 方法的定义:

glom(target, spec, **kwargs)

我们看看参数的含义:

  • target:目标数据,可以是dict、list或者其他任何对象
  • spec:是我们希望输出的内容

下面我们来使用这个方法。

先看一个例子。我们有一个 dict ,想要获取出 所有 name 的值,我们可以通过 glom 来实现:

data={"student":{"info":[{"name":"张三"},{"name":"李四"}]}}
info=glom(data,("student.info",["name"]))
print(info)#['张三','李四']

如果用传统方式的话,我们可能会需要遍历才能获取到,但是使用 glom ,我们只需要一行代码就可以了,输出是一个数组。

如果你不想输出数组,而是想要一个 dict 的话,那也是很简单的:

info=glom(data,{"info":("student.info",["name"])})
print(info)#{'info':['张三','李四']

我们只需要将原来的数组赋值给一个字典来接收就好了。

搞定麻烦需求

假如我现在有两组数据,我要取出 name 的值:

data_1={"school":{"student":[{"name":"张三"},{"name":"李四"}]}}
data_2={"school":{"teacher":[{"name":"王老师"},{"name":"赵老师"}]}}

spec_1={"name":("school.student",["name"])}
spec_2={"name":("school.teacher",["name"])}
print(glom(data_1,spec_1))#{'name':['张三','李四']}
print(glom(data_2,spec_2))#{'name':['王老师','赵老师']}

我们通常是这么写,对吗?假如我们有好多组数据,每组都是类似的取法呢?这时候我们就会想办法避免一个个重复写 N 行参数了,我们可以使用 Coalesce 方法:

data_1={"school":{"student":[{"name":"张三"},{"name":"李四"}]}}
data_2={"school":{"teacher":[{"name":"王老师"},{"name":"赵老师"}]}}

spec={"name":(Coalesce("school.student","school.teacher"),["name"])}

print(glom(data_1,spec))#{'name':['张三','李四']}
print(glom(data_2,spec))#{'name':['王老师','赵老师']}

我们可以用 Coalesce 把多个需求聚合起来,然后针对同一个 spec 来取值就行了。

下面再来一个大杀器——取值计算。glom 还可以对取值进行简单计算,我们来看例子:

data={"school":{"student":[{"name":"张三","age":8},{"name":"李四","age":10}]}}
spec={"sum_age":("school.student",["age"],sum)}
print(glom(data,spec))#{'sum_age':18}

总结

介绍了这么多,大家应该知道 glom 的厉害之处了吧,据说很多大佬都喜欢使用呢。其实它还有很多其他的实用功能有待大家去发掘,这里就不一一介绍了。

以上就是python glom模块的使用简介的详细内容,更多关于python glom模块的资料请关注其它相关文章!

您可能有感兴趣的文章
Python自动化运维-使用Python脚本监控华为AR路由器关键路由变化

Python自动化运维-netmiko模块设备自动发现

Python自动化运维—netmiko模块连接并配置华为交换机

Python自动化运维-利用Python-netmiko模块备份设备配置

Python自动化运维-Paramiko模块和堡垒机实战