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 相关文章推荐
gearman的安装启动及python API使用实例
Jul 08 Python
寻找网站后台地址的python脚本
Sep 01 Python
Python基于scapy实现修改IP发送请求的方法示例
Jul 08 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
Jun 04 Python
详解Django的model查询操作与查询性能优化
Oct 16 Python
解决Python2.7中IDLE启动没有反应的问题
Nov 30 Python
Python子类继承父类构造函数详解
Feb 19 Python
pandas 如何分割字符的实现方法
Jul 29 Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 Python
python深copy和浅copy区别对比解析
Dec 26 Python
如何通过命令行进入python
Jul 06 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
python实现简单反弹球游戏
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 #Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
python 利用 PIL 将数组值转成图片的实现
python实现网络五子棋
You might like
DISCUZ 分页代码
2007/01/02 PHP
PHP中header和session_start前不能有输出原因分析
2013/01/11 PHP
浅析THINKPHP的addAll支持的最大数据量
2015/02/03 PHP
基于PHP如何把汉字转化为拼音
2015/12/11 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
2015/12/24 PHP
checkbox 多选框 联动实现代码
2008/10/22 Javascript
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
UI Events 用户界面事件
2012/06/27 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
Javascript检查图片大小不要让大图片撑破页面
2014/11/04 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
js实现按钮颜色渐变动画效果
2015/08/20 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
JS实现的冒泡排序,快速排序,插入排序算法示例
2019/03/02 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
Django实现图片文字同时提交的方法
2015/05/26 Python
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
python自动发邮件总结及实例说明【推荐】
2019/05/31 Python
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
LINUX下线程,GDI类的解释
2012/04/17 面试题
土地转让协议书范本
2014/04/15 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
球队口号
2014/06/18 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
2015入党自传书范文
2015/06/26 职场文书
大学升旗仪式主持词
2015/07/04 职场文书
幼儿园园长新年寄语
2015/08/17 职场文书
CentOS安装Nginx并部署vue
2022/04/12 Servers
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电
JavaScript实现简单的音乐播放器
2022/08/14 Javascript