问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

眼前一亮!Python 高手都是这样处理数据的!

发布网友 发布时间:2024-10-03 23:16

我来回答

1个回答

热心网友 时间:2024-10-03 23:51

工欲善其事,必先利其器!我们想要更轻松更有效率地开发,必须学会一些“高级”技能。前不久看到一位 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 glomd = {"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 glomraise errglom.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 知识欢迎前往公众号:Python 编程学习圈,每日干货分享

原文:https://juejin.cn/post/7107110987274125325
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
莲花冬天发芽好吗 过冬荷花什么时候发芽 一个手机号怎样登陆两个孩子的长沙市中小学生人人通云平台 人人通怎么进入学校 人人通电脑版学生怎样登录 名侦探柯南真人版3为什么要换人? 真人版柯南,你最喜欢小栗旬还是沟端淳平? 央企中国稀土集团落户江西,衷心希望江西摆脱“环江西经济带”地位_百度... 来天津的央企有哪些 东丽区的央企有哪些 "唇枪舌战" 近义词是什么? ...塑料管子是什么东东啊,.,,,对人身体有没有危害呀!请各位大师... ...我家楼顶对面别人的楼顶门上左右一条龙中间有个珠子,龙下面也是一... 语文题造1句话用上针锋相对、唇枪舌战、寸步不让 “三尺”指的是毛笔还是剑? 一尺的毛笔字 王安忆的《长恨歌》描绘了怎样的上海旧梦? ​ R语言使用aggregate函数和mean函数计算每个分组数据的均值 统计学分组数据均值计算公式 写几句连贯的话,用上"针锋相对”“唇枪舌剑”和“寸步不让”.最好是... 写几句连贯的话,用上"针锋相对”“唇枪舌剑”和“寸步不让”. 用任意四个成语连成一段话 写几句连贯的话,用上"针锋相对""唇枪舌剑"和"寸步不让"三个词语 飞,争,起,寸,非,云,大,必,士,齐,风,偶组成四字成语 毫不惧怕意思是什么?唇枪舌剑意思是什么?针锋相对意思是什么?寸步不... 花银出火山而贯争必树寸碎土鱼破河能组成那些成语 毫不惧怕,针锋相对,唇枪舌剑,寸步不让,踱步,老迈昏庸,深明大义,宽容大 ... 契税退钱是什么意思? vivox9splus进入re后,音量键选择wipe data/factory reset,清空数据/恢 ... 如何让office默认启动2007版 这几天整理的Python BUG的问题以及解决方案 童子尿是否有药用价值 童子尿几岁到几岁属于童子撒尿 一个男的对别的女生很开朗很主动聊天,却对你不主动,你不找他,他永远... 我是女生性格很内向,我的同事们都特别开朗,我不知道怎么样和她们相处... ...有限公司怎么走,具体地址在哪儿,地址越详细越好,请知道的朋友告诉我... ...该怎么办?她知道我喜欢她,我不知道她这样是不是心里有我 烟台福山有哪些知名的 企业,,,?越多越好。。 烟台栖霞同兴实业怎么样?机械本科生发展前景如何?越详细越好!! 说某人性格很内向,而“内向”是什么意思?具体是说哪种人?要怎么改变这... 烟台恒辉压力容器公司怎么样 越详细越好 郁金香岸交通方便吗?应该怎么过去? 有谁知道苏宁易购有一个一元钱的拼团是什么?类似拼多多性质的_百度... 苏宁易购的一分拼团活动。是不是凑够五个人就可以百分百得到的_百度... 关于日本如常的笑话 ...第一代国王(拉玛一世)呢~~?~谢谢~~高手帮忙~~ 日本侵华年表 从十九世纪的一直到1945年 ...れでどろぼうはできません。 请翻译下!!一个日本狗讲的! 购买日货有那些利弊,请大家谈谈 拨打日本在华企业的免费电话有用吗 ...眉部有刺痛,发现有一毫米左右的伤口,微红,无出血,会得艾滋吗_百度知...