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 相关文章推荐
如何搜索查找并解决Django相关的问题
Jun 30 Python
web.py在模板中输出美元符号的方法
Aug 26 Python
在Python中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
python转换字符串为摩尔斯电码的方法
Jul 06 Python
python实现壁纸批量下载代码实例
Jan 25 Python
python线程中同步锁详解
Apr 27 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
Jan 22 Python
Python selenium模拟网页点击爬虫交管12123违章数据
May 26 Python
PyTorch 实现L2正则化以及Dropout的操作
May 27 Python
高考要来啦!用Python爬取历年高考数据并分析
Jun 03 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
python实现简单反弹球游戏
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 #Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
python 利用 PIL 将数组值转成图片的实现
python实现网络五子棋
You might like
PHP 搜索查询功能实现
2016/11/29 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
jQuery 获取URL参数的插件
2010/03/04 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
2019/09/25 Javascript
js 函数性能比较方法
2020/08/24 Javascript
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
Python3.2模拟实现webqq登录
2016/02/15 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
值得收藏的HTML5资源(学习html5的朋友可以收藏下)
2010/07/20 HTML / CSS
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
简述DNS进行域名解析的过程
2013/12/02 面试题
汉语言文学专业自荐信
2014/06/11 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
2014国庆节演讲稿:祖国在我心中(400字)
2014/09/25 职场文书
门卫岗位职责
2015/02/09 职场文书
公司行政管理制度范本
2015/08/05 职场文书
教师理论学习心得体会
2016/01/21 职场文书
CSS3鼠标悬浮过渡缩放效果
2021/04/17 HTML / CSS
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang