开发过程中访问接口时经常用到jq来过滤json,用着觉得不是很爽,于是自己搞一个舒服的 ^_^

先说需求:

输入:参数1:被过滤对象(json、dict、list), 参数2:过滤路径

输出:过滤结果(python对象),默认格式化输出结果,key按字母顺序排列

支持过滤方式:

  • dict key过滤 .key

  • dict key列表 .keys()

  • dict value列表 .values()

  • dict key,value对 .iterms()

  • list过滤 .3 或 .[3]

  • list负索引 .-2 或 .[-2]

  • list切片1 .2:6 或 .[2:6]

  • list切片2 .2: 或 .[2:]

  • list切片3 .:6 或 .[:6]

  • list step1 .1:6:2 或 .[1:6:2]

  • list step2 .1::2 或 .[1::2]

  • list step3 .::2 或 .[::2]

  • string过滤..与list相同

  • string切片..与list相同

  • string 切片 step..与list相同

废话不多说,直接上核心代码,兼容Py2和Py3

from __future__ import unicode_literalsimport json
import sixdef ppt(obj, path='.', with_print=True, normal_path_print=False):base_string = str if six.PY3 else basestringobj = json.loads(obj) if isinstance(obj, base_string) else objfind_str, find_map = '', ['["%s"]', '[%s]', '%s', '.%s']for im in path.split('.'):if not im:continueif isinstance(obj, (list, tuple, base_string)):if im.startswith('[') and im.endswith(']'):im = im[1:-1]if ':' in im:slice_default = [0, len(obj), 1]obj, quota = obj[slice(*[int(sli) if sli else slice_default[i] for i, sli inenumerate(im.split(':'))])], 1else:obj, quota = obj[int(im)], 1else:if im in obj:obj, quota = obj[im], 0elif im.endswith('()'):obj, quota = list(getattr(obj, im[:-2])()), 3else:if im.isdigit():obj, quota = obj[int(im)], 1else:raise KeyError(im)find_str += find_map[quota] % imif with_print:print(obj if isinstance(obj, base_string) elsejson.dumps(obj,indent=4,sort_keys=True,ensure_ascii=False))if normal_path_print:print('get it normally with: <obj>%s' % find_str)return obj

函数名:ppt,pretty print, 想不起更好的简短的命名了 ?_?

参数说明:

  • obj 输入的对象
  • path='.' 过滤字符串
  • with_print=True 是否格式化打印输出过滤结果
  • normal_path_print=False 是否输出过滤器反解后的正常查找方式

举例:

> test = '{"a": [1, 3, 4, 9, 10, 0, 5, 3, 7], "c": [{"h": 1, "d": [{"e": ["f", "g"]}]}], "b": "1234567890", "d": null}'
> ppt(test)
{"a": [1, 3, 4, 9, 10, 0, 5, 3, 7], "b": "1234567890", "c": [{"d": [{"e": ["f", "g"]}], "h": 1}], "d": null
}

上述输出key按字母顺序排序

> ppt(test, '.a.::2', normal_path_print=True)
[1, 4, 10, 5, 7
]
get it normally with: <obj>["a"][::2]
> ppt(test, '.c.0.keys()', normal_path_print=True)
["h", "d"
]
get it normally with: <obj>["c"][0].keys()

方便的地方:

如 一个复杂的引用数据的方式
['all_angles'][0]['nodes'][-1]['children'][1]['children'][3]['id']
换用更简单的方式,可以更简单快速的定位数据:
'all_angles.0.nodes.-1.children.1.children.3.id'

转载于:https://www.cnblogs.com/yun-code/p/8287553.html

python实现命令行工具jq的json路径过滤相关推荐

  1. python工具是什么-使用Python编写命令行工具有什么好的库?

    使用Python编写命令行工具的库很多,我最推荐的还是Google Fire Hello World 要介绍Fire是什么,看一个简单的例子就明白了 # calc.py import fire cla ...

  2. Python -- Scrapy 命令行工具(command line tools)

    结合scrapy 官方文档,进行学习,并整理了部分自己学习实践的内容 Scrapy是通过 scrapy 命令行工具进行控制的. 这里我们称之为 "Scrapy tool" 以用来和 ...

  3. jq linux下载文件,linux下的json命令行工具–jq

    jq是一个很轻量却很强大的命令行下的json解析器.jq是json中的"sed"命令,它可以用来slice.filter.map.transform json数据.jq是用C编写的 ...

  4. 从 1 到完美,用 node 写一个命令行工具

    从 1 到完美,用 node 写一个命令行工具 1. package.json 中的 bin 字段 现在,不管是前端项目还是 node 项目,一般都会用 npm 做包管理工具,而 package.js ...

  5. go语言生成linux桌面快捷,使用Go语言在MacOS创建一个自定义的命令行工具

    使用 MacOS 做开发的朋友都知道,我们一般会使用 Homebrew 做软件包管理,经常会用到 brew install [soft] 来安装各种各样的命令行软件.今天通过一个百科查找的命令行工具( ...

  6. jq输出文本_如何用 Linux 命令行工具解析和格式化输出 JSON | Linux 中国

    我们将使用 Linux 上的命令行工具解析并格式化打印 JSON.它对于在 shell 脚本中处理大型 JSON 数据或在 shell 脚本中处理 JSON 数据非常有用.-- Ostechnix J ...

  7. linux服务器返回json,Linux 命令行工具解析和格式化输出 JSON的方法

    JSON 是一种轻量级且与语言无关的数据存储格式,易于与大多数编程语言集成,也易于人类理解 -- 当然,如果格式正确的话.JSON 这个词代表 J ava S cript O bject N otat ...

  8. 命令行下jq才是JSON 处理利器呀

    jq 简介 JSON 是一种轻量级的数据交换格式.其采用完全独立于语言的文本格式,具有方便人阅读和编写,同时也易于机器的解析和生成.这些特性决定了 JSON 格式越来越广泛的应用于现代的各种系统中.作 ...

  9. JSON 命令行工具

    原文链接: https://wxaxiaoyao.cn/article/92 JQ jq 是一个处理 JSON 数据的 LINUX 命令行工具. 命令帮助 jq - commandline JSON ...

  10. 懒人神器 !一个创意十足的 Python 命令行工具

    作者 | 写代码的明哥 来源 | Python编程时光 当听到某些人说 xx 库非常好用的时候,我们总是忍不住想要去亲自试试. 有一些库,之所以好用,是对一些库做了更高级的封闭,你装了这个库,就会附带 ...

最新文章

  1. C语言指针(就做个笔记)
  2. JavaScript快速入门-ECMAScript本地对象(RexExp)
  3. HDU Problem - 2732 Leapin' Lizards(最大流,拆点建边)
  4. CGCTF-Web-签到2
  5. python3接口自动化测试_【python3+request】python3+requests接口自动化测试框架实例详解教程...
  6. java 手写签名_Android 自定义View手写签名并保存图片
  7. 不怕!在家也能过好情人节 ——用数学浪漫表白的N种方法
  8. Docker Centos安装 Openssh
  9. CF1109D Sasha and Interesting Fact from Graph Theory
  10. 伪数组转化真数组_ES6 数组方法
  11. (48)Xilinx Adder IP核配置(九)(第10天)
  12. php hbase thrift,php通过thrift操作hbase
  13. C++类的常数据成员和常成员函数
  14. android七牛短视频sdk源码,使用七牛开发短视频
  15. 华南农业大学汇编语言综合性实验-将自己的姓名用多种颜色动态显示
  16. 【AUTOSAR-E2E】-1.3-详述COM E2E Callout解决方案
  17. 专业导师告诉你,有哪些51单片机教程值得大力推荐
  18. nodejs服务器与服务器之间通讯问题(nodejs服务器端创建客户端)
  19. 警惕男人出轨的六个高发期
  20. echarts条形图

热门文章

  1. 知识蒸馏 | 知识回顾
  2. SOTA来啦!BERT又又又又又又魔改了!DeBERTa登顶GLUE~
  3. 【SCIR AAAI2021】数据增强没效果?试试用Cluster-to-Cluster生成更多样化的新数据吧...
  4. 【小技巧】33 个神经网络「炼丹」技巧
  5. 【MLNLP顶会论文发表总榜】谷歌最狂,清北入前十,周明、张岳、刘挺华人前三,中美差距何止一点点!...
  6. nlp基础—6.EM算法
  7. pycharm中的常用快捷键与常用设置
  8. 新书榜TOP 20占了17位!榜单里有哪些值得入手的技术新书?
  9. CIA网攻中国11年,内网防护刻不容缓!
  10. 与TensorFlow类似的项目有哪些?TensorFlow的优缺点是什么?