如何有效地漂亮打印 JSON 对象列表? [复制]
Posted
技术标签:
【中文标题】如何有效地漂亮打印 JSON 对象列表? [复制]【英文标题】:How do I efficiently pretty-print a list of JSON objects? [duplicate] 【发布时间】:2013-08-25 15:35:06 【问题描述】:我在一个文本文件中有一个丑陋的 JSON 对象列表,每行一个。我想让它们打印得很好,并将结果发送到一个文件中。
我尝试使用 json.tool 的命令行 python 版本:
parallel python -mjson.tool < jsonList
但是,在解析这个 json 时似乎出了点问题,因为 python 的 json.tool 试图将它作为多个参数打开并因此抛出:
IOError: [Errno 2] No such file or directory: 行内容,包含单引号、空格、双引号
如何强制将每个行分隔的对象视为模块的单个参数?直接在 python 中打开文件并连续处理它是一个低效的解决方案,因为文件很大。尝试这样做会占用 CPU。
【问题讨论】:
是的。一个数 GB 的文本文件。 【参考方案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】:嗯,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
]
]
您可以在r
模式下使用open
从文本文件中输入my_json
。
【讨论】:
我避免在 python 脚本中直接使用 open 命令,因为我不知道 python 会对 2 GB 的文本文件做什么。 看看@这个:***.com/questions/7134338/… @airza:“打开”文件并不意味着“将整个文件加载到内存中”。只需逐行迭代 (for line in file
) 并按所示进行转换。无论文件有多大,它都可以工作。
这个答案有效,但它与 CPU 挂钩,这就是为什么我试图在机器的 16 个内核上并行化进程。也许它不会比简单的答案更快,但我想知道 - 因此提出我提出的问题。
@airza:嗯,它是一个 2 GB 的文件,不管你用什么,都需要时间。如果您需要快速实现,那么为什么不使用 pypy?它比普通的 Python 快得多。但是,我怀疑会有太大的变化,因为 open() 是直接用 C 编写的,所以我真的认为它不会比这更快。【参考方案3】:
我的方法有两个问题,我最终解决了:
默认的并行化将为每个线程生成一个新的 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
我不太确定 n 的最佳值,但由于能够使用多核,该脚本的挂钟时间比简单实现快 4-5 倍。
【讨论】:
以上是关于如何有效地漂亮打印 JSON 对象列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章