将具有不同键的jq对象组合到单个对象中,而不使用--slurp

时间:2017-08-06 20:39:12

标签: python json jq

我有

{"a":1} {"b":2}

我希望使用jq来获取

{"a": 1, "b":2}

jq --slurp add myfile效果很好。但是,我想将其用于jq.py,它没有slurp模式。 jq是否可以在不使用--slurp的情况下为任意对象序列(使用不同的键)执行此操作?

3 个答案:

答案 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。