这是我在下面发布的代码中的segments = body.split('\r\n')
变量(我刚刚从中删除了\r\n
段):
['', 'Application name: dummy.service', 'Source: host2', 'Timestamp: 2019-01-23T22:00:01.026Z', 'Message: LivePnL:in live pricing', '', '', 'Application name: dummy.service', 'Source: host2', 'Timestamp: 2019-01-23T22:00:01.016Z', 'Message: Risk request failed', '', '', 'Application name: dummy.service', 'Source: host2', 'Timestamp: 2019-01-23T22:00:00.994Z', 'Message: Risk request failed', '', '', 'Application name: dummy.service', 'Source: host2', 'Timestamp: 2019-01-23T22:00:00.956Z', 'Message: Risk request failed', '', '', 'Application name: dummy.service', 'Source: host2', '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', '']
我想在应用程序名称、来源和消息之后获取值
期望的输出:
虚拟服务
主机2
LivePnL:实时定价
虚拟服务
主机2
风险请求失败
虚拟服务
主机2
风险请求失败
我尝试了以下代码:
if mail["Subject"].find("Alert for dummy.service 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']
实际产量
打印(信息['来源'])
关键错误:'来源'
几个问题。首先,如果您正在尝试创建查找表,则可以使用字典。但是,您的密钥必须是唯一的,而您的则不是。您将覆盖单个字典中的值。
让我们专注于将数据转换为键值对结构来开始。你的钥匙只限于(只要我可以告诉)alarm
,job
和machine
。由于您的密钥与数据结构中的内容不匹配,您可能必须对其进行硬编码。我们将使用您提供的数据结构作为起点:
things = ['', 'Application name: dummy', 'Source: HOST2', 'Timestamp: 2019-01-23T22:00:01.026Z', 'Message: LivePnL:in live pricing', '', '', 'Application name: dummy', 'Source: HOST2', 'Timestamp: 2019-01-23T22:00:01.016Z', 'Message: Risk request failed', '', '', 'Application name: dummy', 'Source: HOST2', 'Timestamp: 2019-01-23T22:00:00.994Z', 'Message: Risk request failed', '', '', 'Application name: dummy', 'Source: HOST2', 'Timestamp: 2019-01-23T22:00:00.956Z', 'Message: Risk request failed', '', '', 'Application name: dummy', 'Source: HOST2', 'Timestamp: 2019-01-23T22:00:00.927Z', 'Message: Risk request failed', '', '', '']
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
# ['dummy', 'dummy', 'dummy', 'dummy', 'dummy']
sources
# ['HOST2', 'HOST2', 'HOST2', 'HOST2', 'HOST2']
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': 'dummy', 'job': 'HOST2', 'machine': 'LivePnL:in live pricing'}, {'alarm': 'dummy', 'job': 'HOST2', 'machine': 'Risk request failed'}, {'alarm': 'dummy', 'job': 'HOST2', 'machine': 'Risk request failed'}, {'alarm': 'dummy', 'job': 'HOST2', 'machine': 'Risk request failed'}, {'alarm': 'dummy', 'job': 'HOST2', '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
如果未指定)。
肯定有更快、更简洁的方法来做到这一点,但我认为这足以让事情看起来很熟悉,而不是让你陷入新的概念
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句