python windows处理xml文件到panda Dataframe ?

nfzehxib  于 2022-12-17  发布在  Python
关注(0)|答案(2)|浏览(111)

我想这转换这结果这下面的窗口命令到一个Pandas Dataframe .
原始数据在windows机器上使用此命令生成
wmic进程获取标题、进程ID、父进程ID、命令行、创建日期、内核模式时间、用户模式时间、线程计数、句柄计数、工作集大小、峰值工作集大小、虚拟大小、峰值虚拟大小、页面错误、页面文件使用、峰值页面文件使用、读取操作计数、写入操作计数、其他操作计数/format:rawxml
使用以下代码

with f.open("RunningProcess.xml") as praw:

etree = et.parse(praw)
xroot = etree.getroot()
nprop = []

for property in xroot.iter("PROPERTY"):
    xnames = property.get("NAME")
    nprop.append(xnames)

npropf = pandas.DataFrame(index=nprop)
rprows = []
data = []
inner = {}

for child in xroot.iter("PROPERTY"):
    for gchild in child.iterfind('VALUE'):
        inner[gchild.tag] = gchild.text
    data.append(inner)
    rprows.append(pandas.DataFrame(data))
    data = []; inner = {}

finaldf = pandas.concat(rprows, sort=False).reset_index(drop=True)

finaldf.index = nprop

rpdfhtml = finaldf.to_html(index=True, header=True, border=1)

我得到这个结果
first 39 lines of output
我愿意

  • 将前20个索引行转换为列(WriteOperationCount的标题)
  • 将值列改为行。

例如first 9 columns of desired output

ru9i0ody

ru9i0ody1#

欢迎!这是一个有趣的问题。这并不完美,但希望它能有所帮助
我希望尽量避免对任何感兴趣的列进行硬编码。

假设-此文件将具有可预测的字段名称模式。

我使用了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)

重命名列以使Dataframe更易于使用

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)

按列将 Dataframe 连接在一起

df_processes_flat = pd.concat(ls_processes, axis = 1 )

使用先前创建的列表添加列名

df_processes_flat.columns = ls_columns

您将得到一个如下所示的数据框架

我想说这些步骤不可能是最优雅的,但希望它是清楚的发生了什么。

4xrmg8kj

4xrmg8kj2#

您是否有任何与WMI进程相关的工作文档或git hub链接要共享

相关问题