python解析文本并添加到lis

2024-06-26 00:04:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的输出,我是通过python函数得到的,我在for循环中接收下面的每一行文本(作为info)。你知道吗

y.y.y.y:/mount/name mounted on /var/log/da:

 op/s         rpc bklog
2579.20            2.00
read:             ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                1.000           2.000           3.000        4 (4.0%)           5.000           6.000
write:            ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
              2578.200        165768.087       64.296        0 (0.0%)          21.394         13980.817

x.x.x.x:/mount/othername mounted on /data:

 op/s         rpc bklog
 5.00            10.00
read:             ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                0.000           0.000           0.000        0 (0.0%)           0.000           0.000
write:            ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                0.000           0.000           0.000        0 (0.0%)           0.000           0.000

理想情况下,我希望有一个字典,其中包含mountname作为键,后跟所有度量(op/s、rpc、read ops等)的列表。你知道吗

到目前为止,我掌握的情况如下:

for line in info:
    if ":/" in line[0]:
        section = "mountpoint"
        mountname = line[0]
        continue
    elif "op/s" in line[0]:
        section = "globals"
        continue

    elif "read:" in line[0]:
        section = "reads"
        continue

    elif "write:" in line[0]:
        section = "writes"
        continue

    #if section == "mountpoint":
    #    pass
    if section == "globals":
        mountglobals = line 
        for i in mountglobals:
            infos.append(i)
    if section == "reads":
        reads = line
        for i in reads:
            infos.append(i)
    if section == "writes":
        writes = line
        for i in writes:
            infos.append(i)

    parsed[mountname] = {
        "infos": infos
    }

我在迭代方面遗漏了一些东西,因为它会相应地添加键,但是度量列表包含所有度量。我不确定如何指定哪个度量列表属于哪个装入点/键。你知道吗

以下是信息:

[[u'y.y.y.y:/mount/name', u'mounted', u'on', u'/var/log/da:'], [u'op/s', u'rpc', u'bklog'], [u'2579.20', u'2.00'], [u'read:', u'ops/s', u'kB/s', u'kB/op', u'retrans', u'avg', u'RTT', u'(ms)', u'avg', u'exe', u'(ms)'], [u'1.000', u'2.000', u'3.000', u'4', u'(4.0%)', u'5.000', u'6.000'], [u'write:', u'ops/s', u'kB/s', u'kB/op', u'retrans', u'avg', u'RTT', u'(ms)', u'avg', u'exe', u'(ms)'], [u'2578.200', u'165768.087', u'64.296', u'0', u'(0.0%)', u'21.394', u'13980.817'], [u'x.x.x.x:/mount/othername', u'mounted', u'on', u'/data:'], [u'op/s', u'rpc', u'bklog'], [u'5.00', u'10.00'], [u'read:', u'ops/s', u'kB/s', u'kB/op', u'retrans', u'avg', u'RTT', u'(ms)', u'avg', u'exe', u'(ms)'], [u'0.000', u'0.000', u'0.000', u'0', u'(0.0%)', u'0.000', u'0.000'], [u'write:', u'ops/s', u'kB/s', u'kB/op', u'retrans', u'avg', u'RTT', u'(ms)', u'avg', u'exe', u'(ms)'], [u'0.000', u'0.000', u'0.000', u'0', u'(0.0%)', u'0.000', u'0.000']]

我的电流输出如下:

{u'y.y.y.y:/mount/name': {'infos': [u'2579.20', u'2.00', u'1.000', u'2.000', u'3.000', u'4', u'(4.0%)', u'5.000', u'6.000', u'2578.200', u'165768.087', u'64.296', u'0', u'(0.0%)', u'21.394', u'13980.817', u'5.00', u'10.00', u'0.000', u'0.000', u'0.000', u'0', u'(0.0%)', u'0.000', u'0.000', u'0.000', u'0.000', u'0.000', u'0', u'(0.0%)', u'0.000', u'0.000']}, u'x.x.x.x:/mount/othername': {'infos': [u'2579.20', u'2.00', u'1.000', u'2.000', u'3.000', u'4', u'(4.0%)', u'5.000', u'6.000', u'2578.200', u'165768.087', u'64.296', u'0', u'(0.0%)', u'21.394', u'13980.817', u'5.00', u'10.00', u'0.000', u'0.000', u'0.000', u'0', u'(0.0%)', u'0.000', u'0.000', u'0.000', u'0.000', u'0.000', u'0', u'(0.0%)', u'0.000', u'0.000']}}

谢谢你的提示。你知道吗


Tags: inrttforreadkblinesectionexe
1条回答
网友
1楼 · 发布于 2024-06-26 00:04:04

除非您的输入非常大(我不认为是这样),否则我建议您将整个输入读入一个字符串(以下示例假设您的所有输入都在变量s中),并使用re.findall更容易地解析挂载名称和每个挂载名称的相关16个数字:

import re
parsed = {m[0]: m[1:] for m in re.findall(r'(\S+:/\S+)%s' % (r'.*?([\d.]+)' * 16), s, flags=re.DOTALL)}

parsed将变成:

{'y.y.y.y:/mount/name': ('2579.20', '2.00', '1.000', '2.000', '3.000', '4', '4.0', '5.000', '6.000', '2578.200', '165768.087', '64.296', '0', '0.0', '21.394', '13980.817'), 'x.x.x.x:/mount/othername': ('5.00', '10.00', '0.000', '0.000', '0.000', '0', '0.0', '0.000', '0.000', '0.000', '0.000', '0.000', '0', '0.0', '0.000', '0.000')}

相关问题 更多 >