jmethpath系列之2:进阶篇

高阶用法:数据过滤和使用内置函数进行数据转换

 

一、数据过滤:

对于列表数据, jmespath支持基于另一个表达式比较来过滤数据元素的方法. 语法为 [?expression] , 表达式中支持运算符

== != < <= > >= , 比较运算符
|| && ( ) , 逻辑运算符
` ` ' ' , 转义运算符

In [1]: from jmespath import search
 
In [2]: data = {
    ...:   "locations": [
    ...:     {"name": "Seattle", "state": "WA", "size": 83.78},
    ...:     {"name": "New York", "state": "NY", "size": 302.6},
    ...:     {"name": "Bellevue", "state": "WA", "size": 37.51},
    ...:     {"name": "Olympia", "state": "WA", "size": 20.09}
    ...:   ]
    ...: }
 
In [3]: search("locations[?state == 'WA']", data)
Out[3]:
[{'name': 'Seattle', 'state': 'WA', 'size': 83.78},
 {'name': 'Bellevue', 'state': 'WA', 'size': 37.51},
 {'name': 'Olympia', 'state': 'WA', 'size': 20.09}]
 
In [4]: search("locations[?(state=='WA' && name=='Olympia') || state=='NY'] ", data)
Out[4]:
[{'name': 'New York', 'state': 'NY', 'size': 302.6},
 {'name': 'Olympia', 'state': 'WA', 'size': 20.09}]

在上面的表达式中,?state == 'WA'部分是一个筛选表达式。它将判断locations字段对应的列表中state字段是否等于WA, 只有返回为True的数据, 才会被抓取。

第二次解析, ?(state=='WA' && name=='Olympia') || state=='NY' 表达式组合了判断和逻辑运算, 抓取state==WA且name是Olympia的数据, 或者state是NY的数据, 可以看到返回的数据正是这两条


为了解释转义运算符,我们需要修改一下data数据, 增加一条{"name": "TEST", "state": "TEST"}的数据

In [1]: from jmespath import search
 
In [2]: data = {
    ...:   "locations": [
    ...:     {"name": "TEST", "state": "TEST", "size": 20.09},
    ...:     {"name": "New York", "state": "NY", "size": 302.6},
    ...:     {"name": "Bellevue", "state": "WA", "size": 37.51}
    ...:   ]
    ...: }
 
In [3]: search("locations[?name == state]", data)
Out[3]: [{'name': 'TEST', 'state': 'TEST', 'size': 20.09}]
 
In [4]: search("locations[?size>`40`]", data)
Out[4]: [{'name': 'New York', 'state': 'NY', 'size': 302.6}]
 

筛选的表达式中, 没有引号的数据, 标识的是目标数据中对应字段的值, 所以表达式 ?name == state 筛选的的是 locations中 name和state相等的数据. 包括之前想要筛选state == 'WA' 的数据, 需要用 ' ' 对WA进行转义.

如果比较运算需要对数字进行操作, 需要用到另一个转义符 ` ` ,?size>`40`表达式, 筛选的size大于40的数据.

jmespath 还支持应用内置函数对数据进行筛选:如表达式 ?contains(name, 'New') 筛选name字段中包含'New'字符的数据

In [5]: search("locations[?contains(name, 'New')]", data)
Out[5]: [{'name': 'New York', 'state': 'NY', 'size': 302.6}]

 

 二、内置函数

jmespath 提供了丰富的内置函数, 支持对数据的简单处理操作,包括:格式转换,、数据断言, 、求值等常用的功能,函数参数中一个特殊字符 @ 将当前结果传递给函数, 类似于Python中的self, 支持的函数如下:

 1、通用函数:

1)type: 返回对应数据的数据类型

2)not_null:返回未解析为非null的第一个参数

3) length: 返回数据的长度

  4)to_array: 将数据转换为数组类型

 5)to_string 

 6) to_number

2、断言类函数

1)判断目标数据是否包含特定字符

 2)starts_with: 判断目标数据是否以特定字符开头

 3)ends_with: 判断目标数据是否以特定字符结尾

 

 3、求值类函数

1)对数字求值 : abs求绝对值, ceil向上取整,  floor 向下取整

 

 2)列表求值:avg, min, max, sum求平均值, 最大值和最小值, 求和

 3)列表求值 sort, reverse, map, join对列表排序, 逆序, 映射, 聚合成字符串

 

 4)字典求值 min_by, max_by, sort_by根据字典中的key 求最大值,最小值和排序

 5)字典求值 mege, keys, values合并字典, 求字典的键数组, 字典的值数据

 

posted @ 2022-05-31 21:00  xiaoyanhahaha  阅读(193)  评论(0编辑  收藏  举报