pjy-命令行json处理器
pj的Python项目详细描述
pjy是一个命令行工具,用于处理json数据并对其执行查询。 它有点像jq,但使用python语法进行查询。
用法
pjy [EXPR] [FILES]
pjy将从FILES读取json数据,并打印python表达式EXPR的计算结果。
如果FILES丢失或是“-”,pjy将使用stdin。
要使用的最简单的表达式是“d”(用于数据),该表达式输出的输入保持不变。
可以使用多个输入文件。
示例
在pjy中,表达式也被称为“过滤器”,如jq。
只是漂亮的指纹
d(简称“data”)是最基本的过滤器,它代表整个输入:
pjy 'd' {"foo":"bar","baz":[1,2,3]}
打印:
{ "foo": "bar", "baz": [ 1, 2, 3 ] }
选择dict键
过滤器是python表达式,因此我们可以选择dict键:
pjy 'd["baz"]' {"foo":"bar","baz":[1,2,3]}
或者,在pjy中,dict键也是属性:
pjy 'd.baz' {"foo":"bar","baz":[1,2,3]}
两个过滤器都将打印:
[ 1, 2, 3 ]
如果一个键有一个保留名,比如import(keyword)或keys(dict方法),只需使用括号形式。
执行基本操作
可以使用python表达式可以包含的所有内容:
pjy '[i + 1 for i in d["baz"]]' {"foo":"bar","baz":[1,2,3]}
打印:
[ 2, 3, 4 ]
lambda占位符
可以使用特殊标识符_创建lambdas。这个标识符将吸收对它所做的大多数操作,并返回一个应用它们的lambda。 然后,可以应用返回的lambda:
pjy 'map(_ + 1, d.baz)' {"foo":"bar","baz":[1,2,3]}
相当于:
pjy 'map((lambda x: x + 1), d.baz)' {"foo":"bar","baz":[1,2,3]}
将打印:
[ 2, 3, 4 ]
lambda占位符将吸收链接操作:
pjy 'map((_ + 1) * 2, d.baz)' {"foo":"bar","baz":[1,2,3]}
将导致:
[ 4, 6, 8 ]
以及:
pjy 'map(_[1:3] * 2, d)' {"foo":"bar","baz":[1,2,3]}
将返回:
{ "foo": "arar", "baz": [ 2, 3, 2, 3 ] }
管道式迭代
管道(|)可用于在列表上迭代,它接受函数作为右操作数:
pjy 'd.baz | _ + 1' {"foo":"bar","baz":[1,2,3]}
哪个打印:
[ 2, 3, 4 ]
它还对dict的值进行操作,并返回dict:
pjy 'd | (lambda x: repr(x))' {"foo":"bar","baz":[1,2,3]}
值替换为右操作数值,键不变:
{ "foo": "'bar'", "baz": "[1, 2, 3]" }
部分占位符
无法对占位符调用函数,例如,len(_)将不起作用。 但是,可以使用partialhelper来准备函数调用:
pjy 'd | partial(len, _)' {"foo":"bar","baz":[1,2,3]}
打印:
{ "foo": 3, "baz": 3 }
partialres对functools.partialfunction进行编译:它返回一个函数,将作为第一个参数传递的函数包装起来。 返回的函数将调用传递了固定参数的原始函数。 不同之处在于可以传递lambda占位符,它们将被包装器的参数替换。
p是partial函数的短别名,可用于pjy表达式。
进口
可以使用imp函数导入模块:
pjy 'filter(p(imp("fnmatch").fnmatch, _, "f*"), d.keys())' {"foo":"bar","baz":[1,2,3]}
将打印:
[ "foo" ]
math和re模块已经导入并直接可用,无需调用imp。
多个输入
在{TT1} $中,存在一个^ {TT27 } $变量,这是一个包含在命令行上传递的每个输入文件的JSON数据的列表。 变量d只是inputs[0]的别名。例如:
pjy 'filter(_[0] != _[1], zip(inputs[0], inputs[1]))' before.json after.json
将读取2个文件before.json和after.json,这两个文件包含在一个对象列表中,并且pjy将把每个压缩的对象对比较在一起。 然后它将打印不同对的列表。
安全性
pjy本身不写文件(stdout/stderr除外)或套接字,也不运行外部命令。 但是,pjy在python解释器中运行作为参数传递的给定表达式,而不使用沙盒。 因此,不要将危险或不受信任的python表达式传递给pjy。
家属s
pjy是用python 3编写的。它的setup.py需要setuptools。
如果安装了pygments,则pjy的输出将被着色,但它是完全可选的。
版本和许可证
pjy的版本是0.10.0,它使用semantic versioning。 它是根据wtfplv2授权的,有关许可文本,请参见copying.wtfpl。