迭代地解析JSON文件

时间:2014-01-02 15:07:04

标签: python json

我有1000多个看起来像

的JSON文件
{
    "name": "Some name",
    "part_num": "123456",

    "other_config": {
        // Large amount of objects
    },
    "some more": {
        // Large amount of objects
    }
    // etc
}

当我的程序启动时,它必须使用所有这些JSON文件扫描目录,加载每个文件,并提取"name""part_num"值并使用这些值填充列表视图。然后,用户选择一个,然后重新解析该配置,然后采取适当的操作。

问题是阅读许多文件需要一段时间。我已经通过使用multiprocessing在后​​台抛出所有可用内核的工作,然后在完成后填充列表视图,但我仍然受到IO的限制。因为我知道这个代码将在比我的处理器和硬盘驱动器更慢的计算机上运行,​​所以这个速度是不可接受的。

平均情况是我需要的值位于文件的开头,但我不能假设在最坏的情况下。 有没有办法迭代解析JSON文件,以便我可以更快地从这些文件加载​​我需要的东西?

我可以使用正则表达式but I'd really prefer not to

3 个答案:

答案 0 :(得分:1)

YAJL是一个带有Python bindings的事件驱动解析器。这样,一旦检索到所需信息,就可以停止解析。

答案 1 :(得分:1)

这让我想起当天的XML,当时我们有三种解析器样式:基于DOM,基于事件(例如SAX),以及鲜为人知的基于拉的(例如,StAX)。后两者更有效率,因为当你只需要它时,它们不需要将整个文件加载到内存中。

幸运的是,JSON存在类似的事情。对于Python,请查看yajl-py,它是C库Yajl的Python包装器。

通过基于事件的解析器解析需要更多的代码,但它可以更有效。

答案 2 :(得分:1)

ijson以pythonc方式执行迭代json解析。

我想你问题的解决方案是:

import ijson

f = open('...')
objects = ijson.items(f, 'other_config.item')
for part in objects:
    do_something_with(part)

免责声明我没有使用该库。