(数据科学学习手札125)在Python中操纵json数据的最佳方式
本文示例代码及文件已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
在日常使用Python
的过程中,我们经常会与json
格式的数据打交道,尤其是那种嵌套结构复杂的json
数据,从中抽取复杂结构下键值对数据的过程枯燥且费事。
而熟悉xpath
的朋友都知道,对于xml
格式类型的具有层次结构的数据,我们可以通过编写xpath
语句来灵活地提取出满足某些结构规则的数据。
类似的,JSONPath
也是用于从json
数据中按照层次规则抽取数据的一种实用工具,在Python
中我们可以使用jsonpath
这个库来实现JSONPath
的功能。
2 在Python中使用JSONPath提取json数据
jsonpath
是一个第三方库,所以我们首先需要通过pip install jsonpath
对其进行安装。
2.1 一个简单的例子
安装完成后,我们首先来看一个简单的例子,从而初探其使用方式:
这里使用到的示例json
数据来自高德地图步行导航接口,包含了从天安门广场到西单大悦城的步行导航结果,原始数据如下,层次结构较深:
假如我想要获取其嵌套结构中steps
键值对下每段行程的耗时duration
数据,配合jsonpath
就可以这样做:
import json
from jsonpath import jsonpath
# 读入示例json数据
with open('json示例.json', encoding='utf-8') as j:
demo_json = json.loads(j.read())
# 配合JSONPath表达式提取数据
jsonpath(demo_json, '$..steps[*].duration')
其中$..steps[*].duration
就是我们用于描述数据位置规则的JSONPath
语句,配合jsonpath()
便可以提取出对应信息,下面我们就来学习jsonpath
中支持的常用JSONPath
语法:
2.2 jsonpath中的常用JSONPath语法
为了满足日常提取数据的需求,JSONPath
中设计了一系列语法规则来实现对目标值的定位,其中常用的有:
- 按位置选择节点
在jsonpath
中主要有以下几种按位置选择节点的方式:
功能 | 语法 |
---|---|
根节点 | $ |
当前节点 | @ |
子节点 | .或[] |
任意子节点 | * |
任意后代节点 | .. |
让我们来演示一下它们的一些用法:
# 提取所有duration键对应值
jsonpath(demo_json, '$..duration')
# 提取所有steps键的子节点对应instruction值
jsonpath(demo_json, '$..steps.*.instruction')
- 索引子节点
有些时候我们需要在选择过程中对子节点做多选或按位置选择操作,就可以使用到jsonpath
中的相关功能:
# 多选所有steps键的子节点对应的instruction与action值
jsonpath(demo_json, '$..steps.*[instruction,action]')
# 选择steps键的第0个子节点对应的instruction与action值
jsonpath(demo_json, '$..steps[0][instruction,action]')
# 选择steps键的第1到3(不包括3)个子节点对应的instruction与action值
jsonpath(demo_json, '$..steps[1:3][instruction,action]')
# 配合@,选择steps键的最后一个子节点对应的instruction与action值
jsonpath(demo_json, '$..steps[(@.length-1)][instruction,action]')
- 条件筛选
有些时候我们需要根据子节点的某些键值对值,对选择的节点进行筛选,在jsonpath
中支持常用的==
、!=
、>
、<
等比较运算符,以==
比较符为例,这里配合@
定位符从当前节点提取子节点,语法为?(@.键名 比较符 值)
:
# 找到所有steps子节点中orientation为“西”的
jsonpath(demo_json, '$..steps[?(@.orientation == "西")]')
而如果想要提取所有具有指定键的节点,可以参考下面的例子:
# 找到所有具有polyline键的节点对应的polyline与road键对应值
jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]')
2.3 返回结果的形式
在前面的例子中,我们所有的返回结果直接就是提取到的满足条件的结果,而jsonpath()
中还提供了另一种特殊的结果返回形式,只需要设置参数result_type=None
就可以改直接返回结果为返回每个结果的JSONPath
表达式:
# 获取结果的JSONPath表达式
jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]', result_type=None)
以上介绍的均为jsonpath
库中的常规功能,可以满足基础的json
数据提取需求,而除了jsonpath
之外,还有其他具有更加丰富拓展功能的JSONPath
类的第三方库,可以帮助我们实现很多进阶灵活的操作,我们将在下一篇文章中继续讨论。
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
(数据科学学习手札125)在Python中操纵json数据的最佳方式的更多相关文章
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札126)Python中JSON结构数据的高效增删改操作
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...
- (数据科学学习手札136)Python中基于joblib实现极简并行计算加速
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在日常使用Python进行各种数据计算 ...
- (数据科学学习手札53)Python中tqdm模块的用法
一.简介 tqdm是Python中专门用于进度条美化的模块,通过在非while的循环体内嵌入tqdm,可以得到一个能更好展现程序运行过程的提示进度条,本文就将针对tqdm的基本用法进行介绍. 二.基本 ...
- (数据科学学习手札54)Python中retry的简单用法
一.简介 retry是一个用于错误处理的模块,功能类似try-except,但更加快捷方便,本文就将简单地介绍一下retry的基本用法. 二.基本用法 retry: 作为装饰器进行使用,不传入参数时功 ...
- (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
- (数据科学学习手札116)Python+Dash快速web应用开发——交互表格篇(中)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
随机推荐
- 既然有 HTTP 请求,为什么还要用 RPC 调用?
首先,实名赞扬题主的问题.这个问题非常好. 其次,实名反对各个上来就讲RPC好而HTTP不好的答案.因为,题主的观点非常对. HTTP协议,以其中的Restful规范为代表,其优势很大.它可读性好,且 ...
- Spring Cloud Data Flow整合UAA使用外置数据库和API接口
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 之前的文章<Spring Cloud Data Flow整合Cloudfoundry UAA服务做权限控制 ...
- theUnforgiven——项目冲刺
这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/computer-science-class1-2018/ 小组号和队名 8组theUnforgiven ...
- DHCP的简单介绍与配置
一.DHCP简介 二.DHCP报文类型 三.DHCP工作原理 四.实例操作 一.DHCP简介 DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,是一 ...
- 陋居寡闻,初探Github CLI For Windows,开启命令行撸铁时代
简介 gh is GitHub on the command line. It brings pull requests, issues, and other GitHub concepts to t ...
- 『无为则无心』Python序列 — 23、Python序列的公共API
目录 1.运算符 @1.+加号 @2.*乘号 @3.in或not in 2.公共方法 @1.len()方法 @2.del和del() @3.max()方法 @4.min()方法 @5.range() ...
- 18.自动运维工具ansible
1 Ansible 介绍和架构 1.1 Ansible介绍 ansible 的名称来自科幻小说<安德的游戏>中跨越时空的即时通信工具,使用它可以在相距数光年的 距离,远程实时控制前线的舰队 ...
- Kubernetes全栈架构师(Kubeadm高可用安装k8s集群)--学习笔记
目录 k8s高可用架构解析 Kubeadm基本环境配置 Kubeadm系统及内核升级 Kubeadm基本组件安装 Kubeadm高可用组件安装 Kubeadm集群初始化 高可用Master及Token ...
- gRPC 拦截器能做些什么?
什么是拦截器? 拦截器是一种横切维度的功能延展. 具象说明一下,高速收费站就是一种拦截器.它可以做什么?收费,查证,交通控制等等,面向所有穿行过往的车辆. gRPC 拦截器主要分为两种:客户端拦截器( ...
- 计算机基础 | 文档神器docsify安装及基本使用
为啥要用docsify? 神器Docsify让你的文档变得美观,配合typora,从此爱上看文档,各种优点:小巧.快速.美观.方便.快捷.上手快,可以浏览如下优秀案例 ve-charts pyecha ...