【问题标题】:Python: Parse large json filePython:解析大型 json 文件
【发布时间】:2019-03-22 20:34:33
【问题描述】:

我有一个很大的 json 文件。它的日志数据,我已将其压缩为 bz2 格式(myfile.json.bz2)。 bz2 文件的大小为 90MB。我搜索了一个很好的解决方案或博客文章来解释有效地解析压缩的 bz2 json 文件,但找不到任何内容。

由于文件很大,所以做类似的事情是不可能的。

with open('data.json') as data_file:    
    data = json.load(data_file)

最好的方法是什么?

经过一番挖掘,我发现有一个 python 包可以读取 bz2

input_file = bz2.BZ2File(filename, 'r')

【问题讨论】:

  • 你想要一个增量 json 解析器,例如看到这个答案:(link) 另一种可能性是:(link)
  • 因为BZ2File 有一个read 方法可以返回任意数量的字节,我可能会考虑尝试将json 作为流读取,例如pypi.python.org/pypi/ijson

标签: python json


【解决方案1】:

在没有任何其他建议或现有代码的情况下,我建议打开一个流并手动解析大括号和方括号(分别为 {[),直到你有一个完整的对象 { ... } 并在其上运行反序列化.这将允许您在利用现有 JSON 库的同时对 JSON 进行分块。

这不是我通常会推荐的解决方案,但如果现有库不能满足您的需求,它是我能想到的最快、最可靠的解决方案。

【讨论】:

  • 使用像 pykler.github.io/yajl-py 这样的增量 JSON 解析器会更容易、更安全,而不是自己弄清楚。
  • 啊,我不知道那个库。
【解决方案2】:

如果有人正在寻找一种方法来解析在 bz2 中压缩的 wikidata json 转储,这里有一段 sn-p 代码:

import bz2
import json

f = bz2.BZ2File("latest-all.json.bz2", "r")
next(f)  # skip the first line
for line in f:
    print(json.loads(line[:-2]))

【讨论】:

  • 而魔法 -2 代表白色结束符\n\r?
  • -2 代表逗号, 和行尾。最好的性能是使用 json 流解析器进行解析。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多