如何有效地打印JSON对象列表?

时间:2013-08-22 18:37:12

标签: python bash gnu-parallel

我在文本文件中有一个丑陋的JSON对象列表,每行一个。我想让它们打印得很好并将结果发送到文件中。

我尝试使用命令行python版本的json.tool:

parallel python -mjson.tool < jsonList

然而,在解析这个json时似乎出现了一些问题,因为python的json.tool试图将它作为多个参数打开并因此抛出:

IOError:[Errno 2]没有这样的文件或目录:{行内容,包含单引号,空格,双引号}

如何强制将每个行分隔对象视为模块的单个参数?直接在python中打开文件并以串行方式处理它是一种低效的解决方案,因为文件非常庞大。试图这样做会钉住CPU。

3 个答案:

答案 0 :(得分:1)

json模块已经有类似于你的想法了。

>>> import json
>>>
>>> my_json = '["cheese", {"cake":["coke", null, 160, 2]}]'
>>> parsed = json.loads(my_json)
>>> print json.dumps(parsed, indent=4, sort_keys=True)
[
    "cheese", 
    {
        "cake": [
            "coke", 
            null, 
            160, 
            2
        ]
    }
]

您只需在my_json模式下使用open从文本文件中输入r

答案 1 :(得分:1)

GNU Parallel默认将输入作为参数放在命令行上。所以你要做的是:

python -mjson.tool \[\"cheese\",\ \{\"cake\":\[\"coke\",\ null,\ 160,\ 2\]\}\]

但你想要的是:

echo \[\"cheese\",\ \{\"cake\":\[\"coke\",\ null,\ 160,\ 2\]\}\] | python -mjson.tool

GNU Parallel可以使用--pipe -N1:

来实现
parallel -N1 --pipe python -mjson.tool < jsonList

10秒安装:

wget -O - pi.dk/3 | bash

观看介绍视频以获得快速介绍: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

完成教程(man parallel_tutorial)。你命令行 爱你吧。

答案 2 :(得分:0)

我的方法存在两个问题,我最终解决了这个问题:

默认的并行化将为每个线程生成一个新的python VM,这是......慢。太慢了。

默认的json.tool执行天真的实现,但不知何故混淆了传入参数的数量。

我写了这个:

import sys
import json
for i in sys.argv[1:]:
    o = json.loads(i)
    json.dump(o, sys.stdout, indent=4, separators=(',',': '))

然后这样叫:

parallel -n 500 python fastProcess.py&lt; filein&gt; prettyfileout

我不太确定n的最佳值,但由于能够使用多个核心,脚本的挂钟时间比原始实现快4-5倍。