4

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

4

3 回答 3

7

该模块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)
于 2017-11-29T20:31:05.610 回答
4

这里已经有类似的帖子。这是他们提出的解决方案:

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)
于 2012-04-19T23:48:07.723 回答
3

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

使用堆栈来跟踪括号/引号的打开和关闭。扫描字符串中的任何开启者或当前关闭者。扫描文本时,只寻找更近的文本。当你阅读开瓶器时推上一个,当你找到更近的时候将它弹出。

JSON 的完整集是[-> ]{->}"-> "。你应该排除\"您可以在http://www.json.org/查看规范

然后,每当]遇到 a 并且在弹出 match 之后堆栈只有一个项目(顶层 '[')[,那么你就知道是时候开始新的一行了。

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

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

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

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

于 2012-04-20T00:02:49.060 回答