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 ] } ] |
在
我的方法有两个问题,我最终解决了:
默认的并行化将为每个线程生成一个新的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.py
我不太确定n的最佳值,但是由于使用多个内核的能力,脚本的挂钟时间比简单的实现快4-5倍。