我有一个大的json文件(2.4 GB)。我想在python中解析它。数据如下所示:
[
{
"host": "a.com",
"ip": "1.2.2.3",
"port": 8
},
{
"host": "b.com",
"ip": "2.5.0.4",
"port": 3
},
{
"host": "c.com",
"ip": "9.17.6.7",
"port": 4
}
]
我运行此python脚本parser.py
来加载要分析的数据::
import json
from pprint import pprint
with open('mydata.json') as f:
data = json.load(f)
回溯(最近一次通话最后一次):文件“ parser.py”,位于第xx行 data = json.load(f)载入中的文件“ /usr/lib/python3.6/json/init.py”,第296行 返回负载(fp.read(),MemoryError
1)您能否建议我如何加载大文件进行解析,而不会出现此类错误?
2)还有其他方法吗?
答案 0 :(得分:1)
问题是因为文件太大而无法加载到程序中,所以您必须一次加载各部分。
我建议使用ijson或json-streamer,它们可以迭代地加载到json文件中,而不是尝试一次将整个文件加载到内存中。
这是使用ijson的示例:
import ijson
entry = {} # Keeps track of values for each json item
parser = ijson.parse(open('mydata.json'))
for prefix, event, value in parser:
# Start of item map
if (prefix, event) == ('item', 'start_map'):
entry = {} # Start of a new json item
elif prefix.endswith('.host'):
entry['host'] = value # Add value to entry
elif prefix.endswith('.ip'):
entry['ip'] = value
elif prefix.endswith('.port'):
entry['port'] = value
elif (prefix, event) == ('item', 'end_map'):
print(entry) # Do something with complete entry object
每个prefix
在json中存储要插入的当前项目的前缀路径。 event
用于检测映射或数组的开始/结束。 value
用于存储要迭代的当前对象的值。