python实现命令行工具jq的json路径过滤
开发过程中访问接口时经常用到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路径过滤相关推荐
- python工具是什么-使用Python编写命令行工具有什么好的库?
使用Python编写命令行工具的库很多,我最推荐的还是Google Fire Hello World 要介绍Fire是什么,看一个简单的例子就明白了 # calc.py import fire cla ...
- Python -- Scrapy 命令行工具(command line tools)
结合scrapy 官方文档,进行学习,并整理了部分自己学习实践的内容 Scrapy是通过 scrapy 命令行工具进行控制的. 这里我们称之为 "Scrapy tool" 以用来和 ...
- jq linux下载文件,linux下的json命令行工具–jq
jq是一个很轻量却很强大的命令行下的json解析器.jq是json中的"sed"命令,它可以用来slice.filter.map.transform json数据.jq是用C编写的 ...
- 从 1 到完美,用 node 写一个命令行工具
从 1 到完美,用 node 写一个命令行工具 1. package.json 中的 bin 字段 现在,不管是前端项目还是 node 项目,一般都会用 npm 做包管理工具,而 package.js ...
- go语言生成linux桌面快捷,使用Go语言在MacOS创建一个自定义的命令行工具
使用 MacOS 做开发的朋友都知道,我们一般会使用 Homebrew 做软件包管理,经常会用到 brew install [soft] 来安装各种各样的命令行软件.今天通过一个百科查找的命令行工具( ...
- jq输出文本_如何用 Linux 命令行工具解析和格式化输出 JSON | Linux 中国
我们将使用 Linux 上的命令行工具解析并格式化打印 JSON.它对于在 shell 脚本中处理大型 JSON 数据或在 shell 脚本中处理 JSON 数据非常有用.-- Ostechnix J ...
- linux服务器返回json,Linux 命令行工具解析和格式化输出 JSON的方法
JSON 是一种轻量级且与语言无关的数据存储格式,易于与大多数编程语言集成,也易于人类理解 -- 当然,如果格式正确的话.JSON 这个词代表 J ava S cript O bject N otat ...
- 命令行下jq才是JSON 处理利器呀
jq 简介 JSON 是一种轻量级的数据交换格式.其采用完全独立于语言的文本格式,具有方便人阅读和编写,同时也易于机器的解析和生成.这些特性决定了 JSON 格式越来越广泛的应用于现代的各种系统中.作 ...
- JSON 命令行工具
原文链接: https://wxaxiaoyao.cn/article/92 JQ jq 是一个处理 JSON 数据的 LINUX 命令行工具. 命令帮助 jq - commandline JSON ...
- 懒人神器 !一个创意十足的 Python 命令行工具
作者 | 写代码的明哥 来源 | Python编程时光 当听到某些人说 xx 库非常好用的时候,我们总是忍不住想要去亲自试试. 有一些库,之所以好用,是对一些库做了更高级的封闭,你装了这个库,就会附带 ...
最新文章
- C语言指针(就做个笔记)
- JavaScript快速入门-ECMAScript本地对象(RexExp)
- HDU Problem - 2732 Leapin' Lizards(最大流,拆点建边)
- CGCTF-Web-签到2
- python3接口自动化测试_【python3+request】python3+requests接口自动化测试框架实例详解教程...
- java 手写签名_Android 自定义View手写签名并保存图片
- 不怕!在家也能过好情人节 ——用数学浪漫表白的N种方法
- Docker Centos安装 Openssh
- CF1109D Sasha and Interesting Fact from Graph Theory
- 伪数组转化真数组_ES6 数组方法
- (48)Xilinx Adder IP核配置(九)(第10天)
- php hbase thrift,php通过thrift操作hbase
- C++类的常数据成员和常成员函数
- android七牛短视频sdk源码,使用七牛开发短视频
- 华南农业大学汇编语言综合性实验-将自己的姓名用多种颜色动态显示
- 【AUTOSAR-E2E】-1.3-详述COM E2E Callout解决方案
- 专业导师告诉你,有哪些51单片机教程值得大力推荐
- nodejs服务器与服务器之间通讯问题(nodejs服务器端创建客户端)
- 警惕男人出轨的六个高发期
- echarts条形图
热门文章
- 知识蒸馏 | 知识回顾
- SOTA来啦!BERT又又又又又又魔改了!DeBERTa登顶GLUE~
- 【SCIR AAAI2021】数据增强没效果?试试用Cluster-to-Cluster生成更多样化的新数据吧...
- 【小技巧】33 个神经网络「炼丹」技巧
- 【MLNLP顶会论文发表总榜】谷歌最狂,清北入前十,周明、张岳、刘挺华人前三,中美差距何止一点点!...
- nlp基础—6.EM算法
- pycharm中的常用快捷键与常用设置
- 新书榜TOP 20占了17位!榜单里有哪些值得入手的技术新书?
- CIA网攻中国11年,内网防护刻不容缓!
- 与TensorFlow类似的项目有哪些?TensorFlow的优缺点是什么?