Словарь Python - невозможно найти словарь для солнечных строк после строк - PullRequest
0 голосов
/ 25 января 2019

это segments = body.split('\r\n') переменная (я только что удалил \r\n сегмент из нее) из кода, который я разместил ниже:

['', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:01.026Z', 'Message: LivePnL:in live pricing', '', '', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:01.016Z', 'Message: Risk request failed', '', '', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:00.994Z', 'Message: Risk request failed', '', '', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:00.956Z', 'Message: Risk request failed', '', '', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:00.927Z', 'Message: Risk request failed', '', '', '', 'For instructions please see: https://protect-eu.mimecast.com/s/2_5sC864NHV0NWin7Cr2?domain=wiki', '']

Я хочу получить значения после имени приложения, источника и сообщения

Желаемый результат:

Clarion.Pricing.Grid.Service

EC2AMAZ-ITEJKDI

LivePnL: в режиме реального времени

Clarion.Pricing.Grid.Service

EC2AMAZ-ITEJKDI

Сбой запроса риска

Clarion.Pricing.Grid.Service

EC2AMAZ-ITEJKDI

Ошибка запроса риска

i Попробовал следующий код:

if mail["Subject"].find("Alert for  Clarion prod errors") > 0 :
       body = get_autosys_body(mail)
    for line in body.splitlines():
          if 'Application name' in line:

             info = {}
             # removes \r\n - put all output to single line
             segments = body.split('\r\n')
             for i in range(2, len(segments)):

               key = ''
               if segments[i] == 'Application name:':
                 key = 'alarm'

               elif segments[i] == 'Source:':
                 key = 'job'
               elif segments[i] == 'Message:':
                 key = 'machine'
               if key != '':
                 i += 1
               info[key] = segments[i]

    print (info['alarm'])

и я получаю все комбинации клавиш: info ['alarm'],info ['job'], info ['machine']

Фактический вывод

print (info ['source'])

KeyError: 'source'

1 Ответ

0 голосов
/ 25 января 2019

Несколько вопросов. Во-первых, если вы пытаетесь создать справочную таблицу, словари - это путь. Однако ваши ключи должны быть уникальными, а ваши - нет. Вы перезапишете значения в вашем единственном словаре.

Давайте начнем с того, что приведем данные в структуру пары ключ-значение. Ваши ключи ограничены (насколько я могу судить) alarm, job и machine. Поскольку ваши ключи не соответствуют тому, что находится в структуре данных, вам, вероятно, придется жестко их кодировать. Мы будем использовать предоставленную вами структуру данных в качестве отправной точки:

things = ['', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:01.026Z', 'Message: LivePnL:in live pricing', '', '', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:01.016Z', 'Message: Risk request failed', '', '', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:00.994Z', 'Message: Risk request failed', '', '', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:00.956Z', 'Message: Risk request failed', '', '', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:00.927Z', 'Message: Risk request failed', '', '', '', 'For instructions please see: https://protect-eu.mimecast.com/s/2_5sC864NHV0NWin7Cr2?domain=wiki', '']

apps, source, messages = [], [], []

# I want to iterate over each element in things
for element in things:

    # Now, each element has one of two possibilities, an empty string or key-value
    # I will skip the empties like so
    if not element:
        continue

    # Now I will split on ': ' since I don't want a leading space in values
    k, v = element.split(': ')

    # And we match on the keys here
    if k=='Application name':
         apps.append(v)
    elif k=='Source':
         sources.append(v)
    elif k=='Message':
         messages.append(v)
    else:
         print(k)

Получает все значения в связанные списки, которые мы можем zip вместе для простой итерации.

apps
# ['Clarion.Pricing.Grid.Service', 'Clarion.Pricing.Grid.Service', 'Clarion.Pricing.Grid.Service', 'Clarion.Pricing.Grid.Service', 'Clarion.Pricing.Grid.Service']
sources
# ['EC2AMAZ-ITEJKDI', 'EC2AMAZ-ITEJKDI', 'EC2AMAZ-ITEJKDI', 'EC2AMAZ-ITEJKDI', 'EC2AMAZ-ITEJKDI']
messages
# ['LivePnL:in live pricing', 'Risk request failed', 'Risk request failed', 'Risk request failed', 'Risk request failed']

Теперь, чтобы построить структуру данных (вот документы для zip:

lookups = []

# zip is putting the lists side-by-side so to speak for easy iteration
for app, src, msg in zip(apps, sources, messages):
    lookups.append({'alarm': app,
                    'job': src,
                    'machine': msg})

Полученная структура данных выглядит следующим образом:

[{'alarm': 'Clarion.Pricing.Grid.Service', 'job': 'EC2AMAZ-ITEJKDI', 'machine': 'LivePnL:in live pricing'}, {'alarm': 'Clarion.Pricing.Grid.Service', 'job': 'EC2AMAZ-ITEJKDI', 'machine': 'Risk request failed'}, {'alarm': 'Clarion.Pricing.Grid.Service', 'job': 'EC2AMAZ-ITEJKDI', 'machine': 'Risk request failed'}, {'alarm': 'Clarion.Pricing.Grid.Service', 'job': 'EC2AMAZ-ITEJKDI', 'machine': 'Risk request failed'}, {'alarm': 'Clarion.Pricing.Grid.Service', 'job': 'EC2AMAZ-ITEJKDI', 'machine': 'Risk request failed'}]

Каждая запись в lookup теперь представляет собой dictionary с клавишами тревоги, задания и машины. Вы можете get каждое значение итеративно, вот так:

for entry in lookup:
    print('alarm: %s'%entry.get('alarm'))
    ... # continue for other keys

Примечание. Я использую метод get вместо entry['alarm'], это более надежный поиск, в котором не используется KeyErrors и вместо него возвращается значение по умолчанию (None, если не указано) .

Определенно, есть более быстрые и лаконичные способы сделать это, но я думаю, что этого достаточно, чтобы все выглядело знакомо и не утомляло вас новыми концепциями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...