• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python glom模块的使用简介

    工欲善其事,必先利其器!我们想要更轻松更有效率地开发,必须学会一些“高级”技能。前不久看到一位 Python 高僧的代码,其中使用了一个短小精悍的模块,我认为还蛮有用的,今天分享给大家。

    这个模块就叫 glom ,是 Python 处理数据的一个小模块,它具有如下特点:

    看起来比较抽象,对不对?下面我们用实例来给大家演示一下。

    安装

    作为 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)

    我们看看参数的含义:

    下面我们来使用这个方法。

    先看一个例子。我们有一个 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模块的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • 理解深度学习之深度学习简介
    • 13个最常用的Python深度学习库介绍
    • Python 的lru_cache装饰器使用简介
    • 深度学习详解之初试机器学习
    上一篇:Python的flask接收前台的ajax的post数据和get数据的方法
    下一篇:利用python做表格数据处理
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python glom模块的使用简介 python,glom,模块,的,使用,