如何有效地漂亮打印 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 prettyfileout

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

【讨论】:

以上是关于如何有效地漂亮打印 JSON 对象列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Go 漂亮地打印 JSON?

如何漂亮地打印 Golang 结构? [复制]

当使用 Spring MVC for REST 时,如何让 Jackson 漂亮地打印呈现的 JSON?

使用 JavaScript 漂亮地打印 JSON

使用 JavaScript 漂亮地打印 JSON

html中的漂亮Json对象