关于python:如何高效地打印JSON对象列表?

How do I efficiently pretty-print a list of JSON objects?

本问题已经有最佳答案,请猛点这里访问。

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

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

1
parallel python -mjson.tool < jsonList

但是,在解析这个JSON时似乎出现了一些问题,因为python的json.tool试图将其作为多个参数打开,从而抛出:

ioerror:[errno 2]没有这样的文件或目录:行内容,其中包含单引号、空格、双引号

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


默认情况下,gnu parallel将把输入作为参数放在命令行上。所以你要做的是:

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

但你想要的是:

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

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

1
parallel -N1 --pipe python -mjson.tool < jsonList

10秒安装:

1
wget -O - pi.dk/3 | bash

观看介绍视频以快速了解:https://www.youtube.com/playlist?列表=PL284C9FF2488BC6D1或AT

浏览教程(Man Parallel_教程)。您的命令行因为爱你。


好吧,JSON模块已经有了与您所想到的类似的东西。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> 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
        ]
    }
]

r模式下,您可以使用open从文本文件输入my_json


我的方法有两个问题,我最终解决了:

默认的并行化将为每个线程生成一个新的python vm,即…慢。太慢了。

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

我写了这个:

1
2
3
4
5
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.pyprettyfileout

我不太确定n的最佳值,但是由于使用多个内核的能力,脚本的挂钟时间比简单的实现快4-5倍。