我在文本文件中有一个丑陋的JSON对象列表,每行一个。我想让它们打印得很好并将结果发送到文件中。
我尝试使用命令行python版本的json.tool:
parallel python -mjson.tool < jsonList
然而,在解析这个json时似乎出现了一些问题,因为python的json.tool试图将它作为多个参数打开并因此抛出:
IOError:[Errno 2]没有这样的文件或目录:{行内容,包含单引号,空格,双引号}
如何强制将每个行分隔对象视为模块的单个参数?直接在python中打开文件并以串行方式处理它是一种低效的解决方案,因为文件非常庞大。试图这样做会钉住CPU。
答案 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倍。