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如何快速实现分布式任务
Jul 06 Python
Pycharm更换python解释器的方法
Oct 29 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
python 多线程串行和并行的实例
Feb 22 Python
Django框架首页和登录页分离操作示例
May 28 Python
python多线程http压力测试脚本
Jun 25 Python
Python实现把类当做字典来访问
Dec 16 Python
pytorch实现保证每次运行使用的随机数都相同
Feb 20 Python
python实现IOU计算案例
Apr 12 Python
Keras使用ImageNet上预训练的模型方式
May 23 Python
matplotlib实现数据实时刷新的示例代码
Jan 05 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
python实现简单反弹球游戏
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 #Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
python 利用 PIL 将数组值转成图片的实现
python实现网络五子棋
You might like
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
php中stdClass的用法分析
2015/02/27 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
用js重建星际争霸
2006/12/22 Javascript
javascript 建设银行登陆键盘
2008/06/10 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
JavaScipt中栈的实现方法
2016/02/17 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
小程序实现上传视频功能
2020/08/18 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
linux系统使用python获取内存使用信息脚本分享
2014/01/15 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
使用python接受tgam的脑波数据实例
2020/04/09 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
《问银河》教学反思
2014/02/19 职场文书
关于建议书的格式范文
2014/05/20 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
2016国庆促销广告语
2016/01/28 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
Python机器学习之逻辑回归
2021/05/11 Python
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers