当前位置: 首页 > 后端技术 > Python

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

时间:2023-03-25 20:59:41 Python

工欲善其事,必先利其器!如果我们想要更轻松、更高效地开发,就必须学习一些“高级”的技能。前不久看到一个Python和尚的代码,用的是短小精悍的模块。我觉得还是蛮有用的,今天分享给大家。这个模块叫做glom,是Python处理数据的一个小模块。它具有以下特点:嵌套结构和基于路径的访问使用轻量级Pythonic规范进行声明式数据转换可读且有意义的错误消息内置数据检测而且调试功能看起来更抽象,对吧?让我们用一个例子来告诉你。作为Python内置模块安装,相信你一定知道如何安装:pip3installglom几秒搞定!简单用法让我们看一下最简单的用法:d={"a":{"b":{"c":1}}}print(glom(d,"a.b.c"))#1在这里,我们有A三层嵌套的json结构,我们要获取最内层c对应的值,正常的写法应该是:print(d["a"]["b"]["c"])如果这里,我说glom比传统方式好,因为你不用一层层写括号和引号,你会不会嗤之以鼻?好,我们再来看看下面的情况:d={"a":{"b":None}}print(d["a"]["b"]["c"])遍历到一个None对象,您将收到以下错误:Traceback(mostrecentcalllast):File"/Users/cxhuan/Documents/python_workspace/mypy/pmodules/pglom/glomstudy.py",line10,inprint(d["a"]["b"]["c"])TypeError:'NoneType'objectisnotsubscriptable让我们看看glom是如何处理它的:fromglomimportglomd={"a":{"b":None}}print(glom(d,"a.b.c"))同理,glom不能配对错误的输出,你会得到如下错误:Traceback(mostrecentcalllast):File"/Users/cxhuan/Documents/python_workspace/mypy/pmodules/pglom/glomstudy.py",第11行,在print(glom(d,"a.b.c"))File"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/glom/core.py”,第2181行,在glomraiseerrglom.core.PathAccessError:errorraisedwhileprocessing,detailsbelow.Target-spectrace(mostrecentlast):-Target:{'a':{'b':None}}-规范:'a.b.c'glom.core.PathAccessError:无法访问'c',Path('a','b','c')的第2部分,得到错误:AttributeError(“'NoneType'对象有noattribute'c'")仔细看报错,会发现报错极其详细,一目了然,简直是找程序bug的神器!刚才复杂用法的简单例子让大家对glom有一个直观的认识是的,我们看一下glom的glom方法的定义:glom(target,spec,**kwargs)再看一下参数的含义:target:目标数据,可以是dict,list或者anyotherobjectspec:iswhatwewant输出L的内容让我们用这个方法来看一个例子。我们有一个dict,想要获取name的所有值,可以通过glom来实现:data={"student":{"info":[{"name":"张三"},{"name":"李四"}]}}info=glom(data,("student.info",["name"]))print(info)#['张三','李四']如果你使用传统的方法,我们可能需要遍历获取,但是使用glom,我们只需要一行代码,输出的就是一个数组。如果你不想输出一个数组而是一个字典,那也很简单: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={“姓名”:(“学校.学生”,[“姓名”])}spec_2={“姓名”:(“学校.教师”,[“姓名”])}打印(glom(data_1,spec_1))#{'name':['张三','李四']}print(glom(data_2,spec_2))#{'name':['Ms.王女士”、“赵']}我们一般都是这样写的吧?如果我们有很多组数据,并且每组都以类似的方式获取怎么办?这时候我们就要想办法避免N行参数一个一个重复写,我们可以使用Coalesce的方法:data_1={"school":{"student":[{"name":"ZhangSan"},{"name":"李四"}]}}data_2={"school":{"teacher":[{"name":"王老师"},{"name":"赵老师"}]}}spec={“名称”:(合并(“school.student”,“school.teachr"),["name"])}print(glom(data_1,spec))#{'name':['张三','李四']}print(glom(data_2,spec))#{'name':['王小姐','赵小姐']}我们可以使用Coalesce将多个需求聚合起来,然后得到同一个spec的value。接下来还有一个大杀器——value计算。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编程学习圈,每日干货分享