python glom模块的使用简介
作者:派森酱 发布时间:2021-08-21 10:22:02
目录
安装
简单使用
复杂用法
搞定麻烦需求
总结
工欲善其事,必先利其器!我们想要更轻松更有效率地开发,必须学会一些“高级”技能。前不久看到一位 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 的厉害之处了吧,据说很多大佬都喜欢使用呢。其实它还有很多其他的实用功能有待大家去发掘,这里就不一一介绍了。
来源:https://mp.weixin.qq.com/s/7IvkNpD0lML_9e2tkdjOGA


猜你喜欢
- 1. 获取系统当前时间MySQL 版本为 5.7,详细的时间函数可以参考 MySQL 官方文档 在这里1.1. 获取 YYYY-MM-DD
- 前言在业务迭代中,随着数据量的上升,会出现慢SQL情况,但是当我们去分析单条SQL的时候,发现其执行速度并没有那么慢,原因是什么呢,那么就可
- 先来了解下什么是数据库连接池数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数
- centos7用crontab进行mysql定时备份1、建立 mysql3306_backup.sh 文件文件名及路径可以自定义,个人习惯将
- 写在前面最近写周赛题, 逃不开的一种题型是设计数据结构, 也就是第三题, 做这种题需要的就是对语言中的容器以及常用排序查找算法的掌握, 而我
- 所谓的列表推导式,就是指的轻量级循环创建列表。基本使用方式# 创建一个0-10的列表a = [x for x in range(11)]pr
- 你还没用 jQuery 写过导航菜单? 相信看到这些出色的jQuery导航菜单后,一定会为此而后悔没早点把 jQuery 应用到自己的Web
- 我是一个初入互联网的视觉设计师,和以往做设计感受最大的不同就是:一个设计的最终定稿会受到多方面的挑战,有来自产品经理的,来自开发的,来自测试
- 前言提示:这里可以添加本文要记录的大概内容:公司里B2B是通过WinSCP里SFTP与客户进行数据传输,WinSCP是一个Windows环境
- 对Python中正则表达式的理解,主要就是对符号的理解,本文即对Python中常用的正则表达式符号进行简析。其主要的符号有:.默认匹配一个字
- Models内容from django.db import modelsfrom django import forms# Create y
- 本文实例讲述了Python基于property实现类的特性操作。分享给大家供大家参考,具体如下:Python中的特性是一个函数,但是在使用的
- 纪念我的第一个爬虫程序,一共写了三个白天,其中有两个上午没有看,中途遇到了各种奇怪的问题,伴随着他们的解决,对于一些基本的操作也弄清楚了。果
- 换用非默认浏览器时需要输入密码或token查询方法:在XX:\AnacondaXX\Scripts下 运行jupyter-notebook.
- 本文实例讲述了Python操作MySQL数据库的两种方式。分享给大家供大家参考,具体如下:第一种 使用pymysql代码如下:import
- 除法啰嗦的,不仅是python。整数除以整数看官请在启动idle之后,练习下面的运算:>>> 2/50>>&g
- 一、配置webdriver下载谷歌浏览器驱动,并配置好import timeimport randomfrom PIL import Ima
- 创建工程时,选择已存在的环境(不要选择虚拟环境,虽然安全,但很慢)添加环境在 anaconda3/bin/python3.6 即 d:/an
- 使用神经网络进行样本训练,要实现随机梯度下降算法。这里我根据麦子学院彭亮老师的讲解,总结如下,(神经网络的结构在另一篇博客中已经定义):de
- 判断类型在Python中我们可以使用type进行类型的判断#我们想看一个对象的的类型可以这样class A: passa = A