在Python中加载大型JSON列表的最佳方法是什么?

时间:2012-04-19 23:33:57

标签: python json large-files

我可以访问一组文件(每个大约80-800mb)。不幸的是,每个文件中只有一行。该行只包含一个JSON对象(列表列表)。将它加载并解析为较小的JSON对象的最佳方法是什么?

3 个答案:

答案 0 :(得分:4)

已有类似的帖子here。以下是他们提出的解决方案:

import json
with open('file.json') as infile:
  o = json.load(infile)
  chunkSize = 1000
  for i in xrange(0, len(o), chunkSize):
    with open('file_' + str(i//chunkSize) + '.json', 'w') as outfile:
      json.dump(o[i:i+chunkSize], outfile)

答案 1 :(得分:3)

如果您试图避免将整个列表加载到内存中,可以先将文件作为文本处理:

使用堆栈跟踪括号/引号的打开和关闭。扫描任何开启者的字符串,或当前更近的开启者。扫描文本时,只查看较近的文本。在阅读开启器时按下一个,当你找到开门器时将其弹出。

JSON的完整集合为[ - > ]{ - > }" - > "。您应该排除\"。您可以在http://www.json.org/

查看规范

然后,只要遇到]并且堆栈只有一个项目(弹出匹配的[后的顶级'['),那么您就知道是时候开始新的一行了。 / p>

最后,您应该确保第一个[和最后一个]没有出现在您的输出中。

这将为列表中的每个项目提供单独的JSON对象,每个对象位于文件的单独一行。

如果你深入研究python JSON库,应该有一些解析JSON的函数。您可以利用这些,即使它们不是公共界面的一部分。

当然,您可以通过使用JSON库加载字符串然后按照另一个答案逐项(或多个项目)转储它来实现相同的目的。

答案 2 :(得分:2)

模块pandas 0.21.0现在支持chunksize作为read_json的一部分。您可以一次加载和操作一个块:

import pandas as pd
chunks = pd.read_json(file, lines=True, chunksize = 100)
for c in chunks:
    print(c)