Добро пожаловать! Это был интересный вопрос. Это не идеально, но, надеюсь, это поможет
Я хотел попытаться избежать жесткого кодирования любых интересующих столбцов.
Допущения - Этот файл будет иметь предсказуемый шаблон имен полей.
Я использовал xml.etree.ElementTree
, я нахожу это в прямой библиотеке
import xml.etree.ElementTree as ET
ссылка на XML-файл
file = '/location/to/file/RunningProcess.xml'
Создание плоского DataFrame. Я лично считаю, что это легче разобрать, чем работать полностью в XML, потянув XML
Сначала создайте плоский список
tree = ET.parse(file)
root = tree.getroot()
ls_processes = []
for COMMAND in root.iter('COMMAND'):
for RESULTS in COMMAND.iter('RESULTS'):
for PROPERTY in RESULTS.iter('PROPERTY'):
VALUE = PROPERTY.find('VALUE')
if VALUE is not None:
print(PROPERTY.attrib['NAME'],'|',PROPERTY.attrib['TYPE'],'|', VALUE.text )
ls_processes.append([PROPERTY.attrib['NAME'],PROPERTY.attrib['TYPE'], VALUE.text])
else:
print(PROPERTY.attrib['NAME'],'|',PROPERTY.attrib['TYPE'],'|', "NO VALUE")
ls_processes.append([PROPERTY.attrib['NAME'],PROPERTY.attrib['TYPE'], 'NO VALUE'])
Это создаст нечто, похожее на это
Caption | string | System Idle Process
CommandLine | string | NO VALUE
CreationDate | datetime | 20191002111400.978894+060
HandleCount | uint32 | 0
KernelModeTime | uint64 | 159488690156250
OtherOperationCount | uint64 | 0
Преобразование в фрейм данных
df_processes = pd.DataFrame(ls_processes)
Переименование столбцов, чтобы упростить работу с фреймом данных
df_processes.columns = ['data','type','value']
Создание списка интересующих столбцов
ls_columns = ['Caption', 'ProcessId', 'ParentProcessId', 'CommandLine', 'CreationDate', 'KernelModeTime', 'UserModeTime', 'ThreadCount', 'HandleCount', 'WorkingSetSize', 'PeakWorkingSetSize', 'VirtualSize', 'PeakVirtualSize', 'PageFaults', 'PageFileUsage', 'PeakPageFileUsage', 'ReadOperationCount', 'WriteOperationCount', 'OtherOperationCount']
Создание столбцов Dataframe для каждого интересующего столбца
ls_processes = []
for column in ls_columns:
print(column)
ls_row = []
for index, row in df_processes.iterrows():
if row['data'] == column:
ls_row.append(row['value'])
df = pd.DataFrame(ls_row)
ls_processes.append(df)
Конкатизация Dataframes вместе по столбцам
df_processes_flat = pd.concat(ls_processes, axis = 1 )
Добавление имен столбцов с использованием ранее созданного списка
df_processes_flat.columns = ls_columns
В итоге вы получите Dataframe, который выглядит следующим образомэлегантно но, надеюсь, понятно, что происходит.