前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(数据科学学习手札125)在Python中操纵json数据的最佳方式

(数据科学学习手札125)在Python中操纵json数据的最佳方式

作者头像
Feffery
发布2021-08-06 10:58:40
2.3K0
发布2021-08-06 10:58:40
举报

本文示例代码及文件已上传至我的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就可以这样做:

代码语言:javascript
复制
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中主要有以下几种按位置选择节点的方式:

功能

语法

根节点

$

当前节点

@

子节点

.或[]

任意子节点

*

任意后代节点

..

  让我们来演示一下它们的一些用法:

代码语言:javascript
复制
# 提取所有duration键对应值
jsonpath(demo_json, '$..duration')
代码语言:javascript
复制
# 提取所有steps键的子节点对应instruction值
jsonpath(demo_json, '$..steps.*.instruction')
  • 索引子节点

  有些时候我们需要在选择过程中对子节点做多选或按位置选择操作,就可以使用到jsonpath中的相关功能:

代码语言:javascript
复制
# 多选所有steps键的子节点对应的instruction与action值
jsonpath(demo_json, '$..steps.*[instruction,action]')
代码语言:javascript
复制
# 选择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中支持常用的==!=><等比较运算符,以==比较符为例,这里配合@定位符从当前节点提取子节点,语法为?(@.键名 比较符 值)

代码语言:javascript
复制
# 找到所有steps子节点中orientation为“西”的
jsonpath(demo_json, '$..steps[?(@.orientation == "西")]')

  而如果想要提取所有具有指定键的节点,可以参考下面的例子:

代码语言:javascript
复制
# 找到所有具有polyline键的节点对应的polyline与road键对应值
jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]')

2.3 返回结果的形式

  在前面的例子中,我们所有的返回结果直接就是提取到的满足条件的结果,而jsonpath()中还提供了另一种特殊的结果返回形式,只需要设置参数result_type=None就可以改直接返回结果为返回每个结果的JSONPath表达式:

代码语言:javascript
复制
# 获取结果的JSONPath表达式
jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]', result_type=None)

  以上介绍的均为jsonpath库中的常规功能,可以满足基础的json数据提取需求,而除了jsonpath之外,还有其他具有更加丰富拓展功能的JSONPath类的第三方库,可以帮助我们实现很多进阶灵活的操作,我们将在下一篇文章中继续讨论。


  以上就是本文的全部内容,欢迎在评论区与我进行讨论~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-08-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 简介
  • 2 在Python中使用JSONPath提取json数据
    • 2.1 一个简单的例子
      • 2.2 jsonpath中的常用JSONPath语法
        • 2.3 返回结果的形式
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档