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 正则式 概述及常用字符
May 07 Python
Python3基础之输入和输出实例分析
Aug 18 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
pandas数据框,统计某列数据对应的个数方法
Apr 11 Python
Python实现的NN神经网络算法完整示例
Jun 19 Python
python实现定时发送qq消息
Jan 18 Python
Python面向对象实现一个对象调用另一个对象操作示例
Apr 08 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
Nov 15 Python
简单了解django处理跨域请求最佳解决方案
Mar 25 Python
Pytorch 使用不同版本的cuda的方法步骤
Apr 02 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
python实现简单反弹球游戏
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 #Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
python 利用 PIL 将数组值转成图片的实现
python实现网络五子棋
You might like
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Django1.7+python 2.78+pycharm配置mysql数据库教程
2014/11/18 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
利用Python实现在同一网络中的本地文件共享方法
2018/06/04 Python
Python ORM编程基础示例
2020/02/02 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
基于python实现计算两组数据P值
2020/07/10 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
生产车间主管岗位职责
2013/12/28 职场文书
初中三好学生事迹材料
2014/01/13 职场文书
统计系教授推荐信
2014/02/28 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
防沙治沙典型材料
2014/05/07 职场文书
启动Tomcat时出现大量乱码的解决方法
2021/06/21 Java/Android
详细聊聊Oracle表碎片对性能有多大的影响
2022/03/19 Oracle
德生2P3收音机开箱评测
2022/04/30 无线电