1

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

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

parallel python -mjson.tool < jsonList

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

IOError: [Errno 2] No such file or directory: {行内容,其中包含单引号、空格、双引号}

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

4

3 回答 3

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
        ]
    }
]

您可以使用in模式my_json从文本文件中输入。openr

于 2013-08-22T18:41:34.293 回答
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)。你爱你的命令行。

于 2013-08-22T21:32:54.910 回答
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=(',',': '))

然后这样称呼它:

并行 -n 500 python fastProcess.py <filein> prettyfileout

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

于 2013-08-22T21:24:12.747 回答