我有以下一段代码,它可以工作,但可以按需打印出数据。我正在尝试(未成功)将结果放入数据框,以便将结果导出到csv文件。 我正在遍历一个json文件,结果是正确的,我只需要打印两列即可进入数据框而不是打印结果。我取出了导致错误的代码,因此它将运行。
import json
import requests
import re
import pandas as pd
data = {}
df = pd.DataFrame(columns=['subtechnique', 'name'])
df
RE_FOR_SUB_TECHNIQUE = r"(T\d+)\.(\d+)"
r = requests.get('https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json', verify=False)
data = r.json()
objects = data['objects']
for obj in objects:
ext_ref = obj.get('external_references',[])
revoked = obj.get('revoked') or '*****'
subtechnique = obj.get('x_mitre_is_subtechnique')
name = obj.get('name')
for ref in ext_ref:
ext_id = ref.get('external_id') or ''
if ext_id:
re_match = re.match(RE_FOR_SUB_TECHNIQUE, ext_id)
if re_match:
technique = re_match.group(1)
sub_technique = re_match.group(2)
print('{},{}'.format(technique+'.'+sub_technique, name))
除非有更简单的方法将每一行的结果放入循环并将其附加到csv文件中。
感谢您的帮助。
谢谢
答案 0 :(得分:2)
在这种情况下,直接写csv文件而不是通过Pandas可能更容易:
with open("enterprise_attack.csv", "w") as f:
my_writer = csv.writer(f)
for obj in objects:
ext_ref = obj.get('external_references',[])
revoked = obj.get('revoked') or '*****'
subtechnique = obj.get('x_mitre_is_subtechnique')
name = obj.get('name')
for ref in ext_ref:
ext_id = ref.get('external_id') or ''
if ext_id:
re_match = re.match(RE_FOR_SUB_TECHNIQUE, ext_id)
if re_match:
technique = re_match.group(1)
sub_technique = re_match.group(2)
print('{},{}'.format(technique+'.'+sub_technique, name))
my_writer.writerow([technique+"."+sub_technique, name])
应注意,以上内容将覆盖之前所有运行的输出。如果希望保留多次运行的输出,请将文件模式更改为“ a”:
with open("enterprise_attack.csv", "a") as f: