【发布时间】:2022-01-10 11:46:02
【问题描述】:
我有数千个非常大的 JSON 文件,需要对特定元素进行处理。为了避免内存过载,我使用了一个名为 ijson 的 python 库,当我只处理 json 文件中的单个元素但当我尝试一次处理多个元素时,它可以正常工作
IncompleteJSONError:解析错误:过早的 EOF
部分 JSON:
{
"info": {
"added": 1631536344.112968,
"started": 1631537322.81162,
"duration": 14,
"ended": 1631537337.342377
},
"network": {
"domains": [
{
"ip": "231.90.255.25",
"domain": "dns.msfcsi.com"
},
{
"ip": "12.23.25.44",
"domain": "teo.microsoft.com"
},
{
"ip": "87.101.90.42",
"domain": "www.msf.com"
}
]
}
}
工作代码:(打开多个文件)
my_file_list = [f for f in glob.glob("data/jsons/*.json")]
final_result = []
for filename in my_file_list:
row = {}
with open(filename, 'r') as f:
info = ijson.items(f, 'info')
for o in info:
row['added']= float(o.get('added'))
row['started']= float(o.get('started'))
row['duration']= o.get('duration')
row['ended']= float(o.get('ended'))
with open(filename, 'r') as f:
domains = ijson.items(f, 'network.domains.item')
domain_count = 0
for domain in domains:
domain_count+=1
row['domain_count'] = domain_count
失败代码:(单个文件打开)
my_file_list = [f for f in glob.glob("data/jsons/*.json")]
final_result = []
for filename in my_file_list:
row = {}
with open(filename, 'r') as f:
info = ijson.items(f, 'info')
for o in info:
row['added']= float(o.get('added'))
row['started']= float(o.get('started'))
row['duration']= o.get('duration')
row['ended']= float(o.get('ended'))
domains = ijson.items(f, 'network.domains.item')
domain_count = 0
for domain in domains:
domain_count+=1
row['domain_count'] = domain_count
不确定这是否是原因 Using python ijson to read a large json file with multiple json objects ijson 无法同时处理多个 json 元素。
另外,请告诉我任何其他 python 包或任何可以处理大尺寸 json 而没有内存问题的示例示例。
【问题讨论】:
-
我过去曾使用pypi.org/project/json-stream 完成这项任务。工作得很好。如果您没有获得有关 ijson 的帮助,可以尝试一下。非易失性。我认为这是一个 TextIO 阅读问题。答案部分的详细信息。