python glom模块的使用简介


Posted in Python onApril 13, 2021

工欲善其事,必先利其器!我们想要更轻松更有效率地开发,必须学会一些“高级”技能。前不久看到一位 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 相关文章推荐
Python缩进和冒号详解
Jun 01 Python
巧用python和libnmapd,提取Nmap扫描结果
Aug 23 Python
Python之reload流程实例代码解析
Jan 29 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
Python的log日志功能及设置方法
Jul 11 Python
简单了解Pandas缺失值处理方法
Nov 16 Python
Python模块 _winreg操作注册表
Feb 05 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
Nov 05 Python
python基础入门之字典和集合
Jun 13 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
Mar 23 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
python实现简单反弹球游戏
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 #Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
python 利用 PIL 将数组值转成图片的实现
python实现网络五子棋
You might like
PHP与MySQL交互使用详解
2006/10/09 PHP
PHP swfupload图片上传的实例代码
2013/09/30 PHP
PHP 断点续传实例详解
2017/11/11 PHP
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
2014/01/02 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
Python中的集合类型知识讲解
2015/08/19 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
护士个人简历自荐信
2013/10/18 职场文书
师范生的个人求职信范文
2014/01/04 职场文书
中学运动会广播稿
2014/01/19 职场文书
幼儿园庆六一游园活动方案
2014/01/29 职场文书
前厅收银主管岗位职责
2014/02/04 职场文书
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
事业单位竞聘上岗实施方案
2014/03/28 职场文书
校庆口号
2014/06/20 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
小学德育工作总结2015
2015/05/12 职场文书
医者仁心观后感
2015/06/17 职场文书