有没有办法从python执行jq

Fir*_*ame 9 python arrays json jq

我正在尝试从我的python脚本执行jq命令.目前,当我从终端(MacOs)执行时,jq命令工作正常.

cat filename.json |jq '{Name:.name, address:.address[0][1].street}'
Run Code Online (Sandbox Code Playgroud)

基本上我正在尝试使用jq从JSON中提取数据.由于JSON包含嵌套数组,我必须使用变量循环.

我的问题是 -

  • 我可以从python脚本执行此命令
  • 如果可以完成,那么我将如何遍历嵌套数组
  • 上面的示例数据中的元素(地址[] [].街道)

我不想使用除python之外的任何语言,因为它会导致兼容性问题.

pea*_*eak 13

从jq FAQ:

问:Python可以使用哪些绑定?

A:

pip install jq#有关详细信息,请参阅https://pypi.python.org/pypi/jq

pip install pyjq#有关详细信息,请参阅https://pypi.python.org/pypi/pyjq

对于你的嵌套数组,循环遍历它听起来像是可以(也许应该)在jq中完成的东西.

  • 我不清楚“jq”和“pyjq”之间的区别,有人可以帮忙吗? (2认同)

小智 7

好吧,我是 jq 的忠实粉丝,但似乎您正在做的事情在 Python 中也无法轻松完成。考虑:

import json

with open("filename.json", "r") as f:
    data = json.load(f)

{"Name": data["name"], "address": data["address"][0][1]["street"]}
Run Code Online (Sandbox Code Playgroud)


Fab*_*ano 7

我相信公认的答案应该是Peak的答案,因为在python中使用C api的正确方法是通过python绑定库,以及https://pypi.python.org/pypi/jqhttps:// pypi。 python.org/pypi/pyjq应该可以正常工作。


话虽这么说,因为我们正在谈论python,所以我想提出一个更pythonic的替代方法:glompip install glomhttps : //glom.readthedocs.io/

不用像in中那样使用DSL jqglom您只需使用纯python(此输出格式称为spec)以所需的格式声明输出即可。在这种情况下,您需要一个简单的方法dict

spec = {'Name': 'name',
        'street': 'address.0.1.street'}
Run Code Online (Sandbox Code Playgroud)

然后只需对您的数据调用glom:

output_data = glom(input_data, spec)
Run Code Online (Sandbox Code Playgroud)

就像一样jq,您也可以glom在命令行上使用:

cat filename.json | glom "{'Name': 'name', 'street': 'address.0.1.street'}"
Run Code Online (Sandbox Code Playgroud)

一个完整的python示例:

import json
from pprint import pprint
from glom import glom


with open('filename.json', 'rt') as f:
    input_data = json.load(f)

spec = {'Name': 'name',
        'street': 'address.0.1.street'}

output_data = glom(input_data, spec)

pprint(output_data)
Run Code Online (Sandbox Code Playgroud)


jq1*_*727 5

sh模块可以轻松地从 python 调用 jq 子进程。例如

import sh
cmd = sh.jq('-M', '{Name:.name, address:.address[0][1].street}', 'filename.json')
print "cmd returned >>%s<<" % cmd.stdout
Run Code Online (Sandbox Code Playgroud)