#python-3.x #pandas #dataframe
#python-3.x #pandas #фрейм данных
Вопрос:
У меня есть следующий фрагмент кода, и он работает, но выводит данные как положено. Я пытаюсь (безуспешно) поместить результаты в фрейм данных, чтобы я мог экспортировать результаты в файл 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"(Td ).(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.
Любая помощь приветствуется.
Спасибо
Ответ №1:
В этом случае, вероятно, проще просто записать 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:
Комментарии:
1. Это работает по большей части, но я получаю возврат на выходе, как я могу избавиться от дополнительного возврата
2. Что вы подразумеваете под возвратом?
3. когда я запускаю код, я получаю это, после каждой строки происходит возврат каретки, и мне нужно, чтобы это исчезло (если возможно). Все примеры являются поддельными только для отображения результатов T123.1234, Name1 n T125.3902, Name2 nm это должно быть T123.1234 Name1 T125.1256 Name2 Я не могу показать это здесь, но между результатами есть пустая строка, и эта пустая строка должна быть gong.
4. Ах, теперь я понимаю. Измените первую строку на
with open("enterprise_attack.csv", "w", newline='') as f:
5. Спасибо, Эдунн, именно то, что мне было нужно