разбирать текст на python и добавлять в список - PullRequest
0 голосов
/ 29 августа 2018

У меня есть вывод ниже, который я передаю через функцию python, где я получаю каждую строку текста ниже в цикле for (как информация).

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

В идеале я хотел бы иметь словарь, содержащий имя монтирования в качестве ключа, за которым следует список всех метрик (операционные / операционные функции, RPC, операционные операции чтения и т. Д.).

Вот что у меня есть:

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']}}

Ценю некоторые подсказки.

1 Ответ

0 голосов
/ 29 августа 2018

Если ваш ввод не слишком велик, что, на мой взгляд, не так, я бы порекомендовал вам прочитать весь ввод в одну строку (в следующем примере предполагается, что все ваши входные данные находятся в переменной 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')}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...