我有这样一种文件结构,其中包含数百行数据:
RHSA-2019:1797 CVE-2017-17485,CVE-2018-12022,CVE-2018-12023,CVE-2018-14718,CVE-2018-14719,CVE-2018-19360,CVE-2018-19361,CVE-2018-19362 cpe:/a:redhat:jboss_bpms:6.4
数据中唯一的一致性是我要分离的3个字段之间的空格以及中间数据的逗号。标记为RHSA的第一种数据类型的项目数始终为1,标记为CVE的数据从1到20个项目以及标记为CPE的数据不等。
我尝试使用split()拆分字符串,但是我确定可以使用python在一个步骤中完成此操作,因为数据集的项目数量不一致,但结构不一致。
我使用
按空间划分数据data = rh.split()
for temp in data:
print(temp)
现在我有
RHSA-2019:1797
CVE-2017-17485,CVE-2018-12022,CVE-2018-12023,CVE-2018-14718,CVE-201814719,CVE-2018-19360,CVE-2018-19361,CVE-2018-19362
cpe:/a:redhat:jboss_bpms:6.4
其中每个数据集都位于单独的行上,因此理想情况下,我想每3行循环一次并将数据放入json中,如下所示:
[{"RHSA":{ "RHSA-2019:1797},
{"CVE" :{ "CVE-2017-17485",
"CVE-2018-12022",
"CVE-2018-12023",
"CVE-2018-14718",
"CVE-2018-14719",
"CVE-2018-19360",
"CVE-2018-19361",
"CVE-2018-19362" },
{"CPE" :{ "cpe:/a:redhat:jboss_bpms:6.4"}]
答案 0 :(得分:1)
您在示例中提供的JSON不是有效的JSON,但是此脚本会产生类似的内容:
line = 'RHSA-2019:1797 CVE-2017-17485,CVE-2018-12022,CVE-2018-12023,CVE-2018-14718,CVE-2018-14719,CVE-2018-19360,CVE-2018-19361,CVE-2018-19362 cpe:/a:redhat:jboss_bpms:6.4'
import re
from collections import defaultdict
import json
d = defaultdict(list)
for i in line.split():
d[re.findall(r'^(\w+)', i)[0].upper()].extend(i.split(','))
print(json.dumps(d, indent=4))
打印:
{
"RHSA": [
"RHSA-2019:1797"
],
"CVE": [
"CVE-2017-17485",
"CVE-2018-12022",
"CVE-2018-12023",
"CVE-2018-14718",
"CVE-2018-14719",
"CVE-2018-19360",
"CVE-2018-19361",
"CVE-2018-19362"
],
"CPE": [
"cpe:/a:redhat:jboss_bpms:6.4"
]
}