在Python中将大文件JSON转换为换行分隔的JSON



我尝试将JSON文件转换为ndJSON,以便我可以将其上传到GCS并将其写入BQ表。我在这里尝试了一切将JSON转换成换行分隔的JSON在Python中,但在我的情况下不起作用,因为我有一个7gb的JSON文件。

我尝试使用这个python代码

import json
with open("input.json", "r") as read_file:
data = json.load(read_file)
result = [json.dumps(record) for record in data]
with open('nd-output.json', 'w') as obj:
for i in result:
obj.write(i+'n')

但是它抬高了

Traceback (most recent call last):
File "my_py_file.py", line 4, in <module>
data = json.load(read_file)
File "/usr/lib/python3.8/json/__init__.py", line 293, in load
return loads(fp.read(),
File "/usr/lib/python3.8/codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
MemoryError

然后我尝试了jq方法,但仍然没有运气

cat input.json | jq -c '.[]'

它了

1477 broken pipe  cat input.json |
1478 killed       jq -c '.[]'
我能做些什么来实现我的目标吗?

从错误消息中可以清楚地看出,您得到的错误与系统内存的可用性有关。而不是将整个json文件加载到内存中,你可以一次加载一小部分数据,然后你可以加载下一部分,以此类推。请参考下面的代码。在这段代码中,ijson包用于将json逐部分转换为ndjson。另外,请注意Google并不正式支持ijson

import ijson

with open('nd-output.json', 'w') as writefile:
with open('input.json', 'r') as data:
for obj in ijson.items(data, 'item'):
writefile.write(str(obj)+'n')

最新更新