Python查找不限层级Json数据中某个key或者value的路径方式


Posted in Python onFebruary 27, 2020

最近项目中有一个小需求,查找json文件中某个key或者value的路径,所以就写了一个简单的小脚本,比较粗糙。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
'''
@author: funcups
'''
from logzero import logger
import ast
 
class HandleJson():
  def __init__(self, data):
    if data == None:
      logger.error('请输入json格式数据')
      exit()
 
    if isinstance(data, str):
      try:
        self.data = ast.literal_eval(data)
      except:
        logger.error('请输入正确的json格式数据')
        exit()
    elif isinstance(data, dict):
      self.data = data
 
  def __paths(self, data, path=''):
    '''
    用于遍历json树
    :param data: 原始数据,或者key对应的value值
    :param path: key值字符串,默认值为''
    :return:
    '''
    if isinstance(data, dict):
      for k, v in data.items():
        tmp = path + "['%s']" % k
        yield (tmp, v)
        yield from self.__paths(v, tmp)
 
    if isinstance(data, list):
      for k, v in enumerate(data):
        tmp = path + '[%d]' % k
        yield (tmp, v)
        yield from self.__paths(v, tmp)
 
  def find_key_path(self, key):
    '''
    查找key路径
    :param key: 需要查找路径的key值
    :return: 包含key值路径的list
    '''
    result = []
    for path,value in self.__paths(self.data):
      if path.endswith("['%s']" % key):
        result.append(path)
    with open('path.txt', 'w+', encoding='utf-8') as f:
      list(map(lambda line: f.write(line + '\r'), result))
    return result
 
  def find_value_path(self, key):
    '''
    查找某个值的路径
    :param key: 需要查找的值,限制为字符串,数字,浮点数,布尔值
    :return:
    '''
    result = []
    for path, value in self.__paths(self.data):
      if isinstance(value, (str, int, bool, float)):
        if value == key:
          result.append(path)
    with open('path.txt', 'w+', encoding='utf-8') as f:
      list(map(lambda line: f.write(line + '\r'), result))
    return result
 
if __name__ == '__main__':
  data = {'name': 'funcups'}
  hj = HandleJson(data)
  res = hj.find_key_path('name')
  print(res)
 
  res = hj.find_value_path('funcups')
  print(res)

补充拓展:python 获取的json字符串取值

获取到的json字符串,然后对其取值

{u'result': {u'10.10.10.100': {u'status': u'OK', u'msg': u"{'listen': {'': set([]), '25': set([]),
'22': set(['10.9.19.148', '10.10.10.1', '10.10.10.130'])}}"}}}

data = result.get('result').get(ip[0]).get('msg')

取值得到的是unicode字符串

转换为字典 可用eval()函数

data = eval(result.get('result').get(ip[0]).get('msg'))

data = data.get('listen')

以上这篇Python查找不限层级Json数据中某个key或者value的路径方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python读取Android permission文件
Nov 01 Python
python删除列表内容
Aug 04 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
Python实现扩展内置类型的方法分析
Oct 16 Python
Redis使用watch完成秒杀抢购功能的代码
May 07 Python
python方法生成txt标签文件的实例代码
May 10 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
Python使用while循环花式打印乘法表
Jan 28 Python
基于python生成器封装的协程类
Mar 20 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
Dec 26 Python
keras 多gpu并行运行案例
Jun 10 Python
python interpolate插值实例
Jul 06 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
Feb 27 #Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 #Python
Python 格式化打印json数据方法(展开状态)
Feb 27 #Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 #Python
python 使用递归实现打印一个数字的每一位示例
Feb 27 #Python
python json 递归打印所有json子节点信息的例子
Feb 27 #Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 #Python
You might like
缅甸的咖啡简史
2021/03/04 咖啡文化
递归列出所有文件和目录
2006/10/09 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
php文件缓存类汇总
2014/11/21 PHP
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
JavaScript判断变量是否为数组的方法(Array)
2016/02/24 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
vue.js input框之间赋值方法
2018/08/24 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
python函数形参用法实例分析
2015/08/04 Python
TensorFlow变量管理详解
2018/03/10 Python
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
Python JSON编解码方式原理详解
2020/01/20 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
英国团购网站:Groupon英国
2017/11/28 全球购物
J2EE中常用的名词进行解释
2015/11/09 面试题
市场部管理制度
2014/02/02 职场文书
兴趣小组活动总结
2014/05/05 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
HttpClient实现表单提交上传文件
2022/08/14 Java/Android