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 (most recent call last): File "/Users/cxhuan/Documents/python_workspace/mypy/pmodules/pglom/glomstudy.py", line 10, in <module> print(d["a"]["b"]["c"]) TypeError: 'NoneType' object is not subscriptable
我们来看看 glom 的处理方式:
from glom import glom d = {"a": {"b": None}} print(glom(d, "a.b.c"))
同样地,glom 不能把错误的输出成对的,你会得到以下错误:
Traceback (most recent call last): File "/Users/cxhuan/Documents/python_workspace/mypy/pmodules/pglom/glomstudy.py", line 11, in <module> print(glom(d, "a.b.c")) File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/glom/core.py", line 2181, in glom raise err glom.core.PathAccessError: error raised while processing, details below. Target-spec trace (most recent last): - Target: {'a': {'b': None}} - Spec: 'a.b.c' glom.core.PathAccessError: could not access 'c', part 2 of Path('a', 'b', 'c'), got error: AttributeError("'NoneType' object has no attribute '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-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
- 这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
Python getsizeof()和getsize()区分详解
这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20- 这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
- 这篇文章主要介绍了解决python 两个时间戳相减出现结果错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-12
- 这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
- 这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
- 这篇文章主要介绍了python进行相关性分析并绘制散点图,具有一定借鉴价值,需要的朋友可以参考下,希望能够给你带来帮助...2021-09-18