我有
{"a":1} {"b":2}
我希望使用jq
来获取
{"a": 1, "b":2}
jq --slurp add myfile
效果很好。但是,我想将其用于jq.py
,它没有slurp
模式。 jq
是否可以在不使用--slurp
的情况下为任意对象序列(使用不同的键)执行此操作?
答案 0 :(得分:2)
对内存的要求比使用[输入]要低:
reduce inputs as $in ({}; . + $in)
以上假设-n命令行选项生效。如果使用py.jq无法做到这一点,则应使用以下过滤器:
reduce inputs as $in (.; . + $in)
P.S。 也许py.jq的作者愿意在知道它的情况下解决有关命令行选项的问题?
答案 1 :(得分:1)
如果您正在使用python读取myfile,splitstream
模块described here可能就是您想要的。这是一个使用jq.py的测试示例(test.py)。
import splitstream
from jq import jq
def slurp(filename):
with open(filename) as f:
for s in splitstream.splitfile(f, format="json"):
yield s
obj = {}
for jstr in slurp('myfile'):
obj = jq("[%s, .] | add" % obj).transform(text=jstr, text_output=True)
print obj
以下是一个示例运行
$ cat myfile
{"a":1}
{"b":2}
$ python test.py
{"a":1,"b":2}
虽然这看起来像你要求使用jq.py所做的那样我认为它不是一个好的解决方案,因为在python和jq之间共享状态是笨拙和低效的。
更好的方法可能是使用jq作为子进程。这是一个例子(test2.py):
import json
import sh
cmd = sh.jq('-M', '-s', 'add', 'myfile')
obj = json.loads( cmd.stdout )
print json.dumps(obj, indent=2)
示例运行:
$ python test2.py
{
"a": 1,
"b": 2
}
答案 2 :(得分:1)
这会产生所需的输出。
jq -nc '[inputs] | add'
我不能说它是否适用于jq.py。