python 将大JSON文件拆分为较小的文件

btxsgosb  于 2022-12-28  发布在  Python
关注(0)|答案(2)|浏览(208)

我需要将非常大的JSON文件(20GB)拆分为多个较小的JSON文件(假设阈值为100 MB)。
示例文件布局如下所示。
file.json

[{"name":"Joe", "Place":"Denver", "phone_number":["980283", "980284", "980285"]},{"name":"kruger", "Place":"boston",
 "phone_number":["980281", "980282", "980283"]},{"name":"Dan", "Place":"Texas","phone_number":["980286", "980287", "980286"]}, {"name":"Kyle", "Place":"Newyork", "phone_number":["980282", "980288", "980289"]}]

输出应如下所示
文件1:

[{"name":"Joe", "Place":"Denver", "phone_number":["980283", "980284", "980285"]}, {"name":"kruger", "Place":"boston", "phone_number":["980281", "980282", "980283"]}]

文件2:

[{"name":"Dan", "Place":"Texas","phone_number":["980286", "980287", "980286"]}, {"name":"Kyle", "Place":"Newyork", "phone_number":["980282", "980288", "980289"]}]

我可以知道最好的实现方法吗?我应该选择shell命令还是python?

wrrgggsh

wrrgggsh1#

Python模块json-stream可以做到这一点,但有一些注意事项,我将在后面介绍。
您必须实现访问者模式。

import json_stream

def visitor(item, path):
    print(f"{item} at path {path}")

with open('mylargejsonfile.json','r') as f:
    json_stream.visit(f, visitor)

每个完整的JSON类型都会调用这个visitor函数,可以说深度优先,所以每个完整的JSON元素(数字、字符串、数组)都会调用这个回调函数,由你决定在哪里暂停处理并写出部分文件。
需要注意的是,如果您的输入文件是一个完整的单一元素(如一个字典),则必须将输出格式更改为其他格式,因为它不能跨文件拆分。
{ "top" : [1,2,3] }
分成两个独立的文件。

jpfvwuh4

jpfvwuh42#

只要文件的结构是每行1个条目,并且主列表中没有子列表条目,你就可以用sed进行基本的字符串替换,这很脆弱,但是相对较快,内存效率也很高,因为sed是为流文本设计的。
以下是就地修改“file.json”的示例:

sed -e 's/^\[//g' -e 's/, *$//g' -e 's/\]$//g' -i file.json

然后,可以使用基本的bash循环(使用read)将每一行写入单独的文件。
要计算输入文件而不修改它并写入目标文件,您可以执行以下操作:

i=1
sed -e 's/^\[//g' -e 's/, *$//g' -e 's/\]$//g' file.json | while read -r line; do
    echo -e "[$line]" > file$i
    i=$((i+1))
done

对于示例文件,它将创建两个文件:file1file2

相关问题