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之外的任何语言,因为它会导致兼容性问题.
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中完成的东西.
小智 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)
我相信公认的答案应该是Peak的答案,因为在python中使用C api的正确方法是通过python绑定库,以及https://pypi.python.org/pypi/jq和https:// pypi。 python.org/pypi/pyjq应该可以正常工作。
话虽这么说,因为我们正在谈论python,所以我想提出一个更pythonic的替代方法:glom(pip install glom,https : //glom.readthedocs.io/)
不用像in中那样使用DSL jq,glom您只需使用纯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)
该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)
| 归档时间: |
|
| 查看次数: |
12252 次 |
| 最近记录: |