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占位符,它们将被包装器的参数替换。

ppartial函数的短别名,可用于pjy表达式。

进口

可以使用imp函数导入模块:

pjy 'filter(p(imp("fnmatch").fnmatch, _, "f*"), d.keys())'
     {"foo":"bar","baz":[1,2,3]}

将打印:

[
  "foo"
]

mathre模块已经导入并直接可用,无需调用imp

多个输入

在{TT1} $中,存在一个^ {TT27 } $变量,这是一个包含在命令行上传递的每个输入文件的JSON数据的列表。 变量d只是inputs[0]的别名。

例如:

pjy 'filter(_[0] != _[1], zip(inputs[0], inputs[1]))' before.json after.json

将读取2个文件before.jsonafter.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。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
eclipse如何在Java中定义main(String[]args)而不出现警告和错误?   java获取正则表达式匹配后的文本   java什么是Gradle深度解释中的buildbyconvention?   java不允许用户更改文本字段   java为aws lambda中的代码生成swagger文件   Android java。网UnknownHostException:主机未解析:服务器地址:443   java onBackPressed()完成我的活动   电子邮件中的java语言环境   面向匿名用户的java Tomcat/spring会话管理   java在参考资料中添加docx文件并创建可执行jar   plsql使用Java执行plsql   使用lambda表达式更新嵌套列表:Java 8   静态数据的java短期与长期