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)判断目标数据是否包含特定字符
![](https://img2022.cnblogs.com/blog/2834169/202205/2834169-20220531205123989-526496069.png)
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合并字典, 求字典的键数组, 字典的值数据