此函数将电子邮件正文作为输入,并分别在应用程序名称、来源和消息后返回值,并且工作正常
def parse_subject(line):
info = {}
segments = line.split(' ')
info['time'] = segments[0]+' '+segments[1]
for i in range(2, len(segments)):
key = ''
if segments[i] == 'Application name:':
key = 'appname'
elif segments[i] == 'Source:':
key = 'source'
elif segments[i] == 'Message:':
key = 'message'
if key != '':
i += 1
info[key] = segments[i]
return info
对于另一种电子邮件正文格式,我需要扩展段格式,因为我需要在邮件正文中搜索更多行,所以我更改了 info['time'],一旦我将段扩展到 2 以上,我就会出现超出范围的错误
info['time'] = segments[0]+' '+segments[1]+' '+segments[2]+' '+segments[3]+' '+segments[4]+' '+segments[5]......up to segment[17]
也许我需要扩展更多
及以上功能失败 list index out of range
我更改了代码但同样的错误:
还尝试更改数字以匹配段数,但相同:
for i in range(<number of segments>, len(segments)):
段示例:长度会有所不同,因为 Message 之后的字符串具有不同的值,有时是 URL 字符串
问题
当我定义段的长度时,让我们说段 [17],
我需要改变的功能不抛出 out of index error
def parse_subject(line):
info = {}
segments = line.split(' ')
info['time'] = segments[0]+' '+segments[1] + ' ' + segments[2] + ' ' + segments[3] + ' ' + segments[4] + ' ' + segments[5] + ' ' + segments[6] + ' ' + segments[7] + ' ' + segments[8] +' ' + segments[9] + ' ' + segments[10] + ' ' + segments[11] + ' ' + segments[12] +' ' + segments[13] + ' ' + segments[14] + ' '
+ segments[15] +' ' + segments[16] + ' ' + segments[17]
for i in range(16, len(segments)):
key = ''
if segments[i] == 'name:':
key = 'appname'
elif segments[i] == 'Source:':
key = 'source'
elif segments[i] == 'Message:':
key = 'message'
if key != '':
i += 1
info[key] = segments[i]
return info
if mail["Subject"].find("PA1") > 0 or mail["Subject"].find("PA2") > 0:
body = get_autosys_body(mail)
# print(body)
for line in body.splitlines():
if 'Application Name' in line:
job_info = parse_subject(line)
break
print(job_info)
我需要传递行变量(下面的内容)
name:Contoso.Service
Source: host15
Timestamp: 2019-01-22T00:00:43.901Z
Message:null
以parse_subject(line)
功能和从上面的输出可以得到:
Contoso.Service
作为价值job_info['appname']
host15
作为价值jobinfo['source']
null
作为价值 jobinfo['message']
在您的代码中,您需要调试它。错误告诉你究竟出了什么问题。
def old_parse_subject(line):
info = {}
segments = line.split(' ')
if len(segments < 18):
raise ValueError("segments[17] won't work if segments is not that long")
您可以在知道错误所在的位置之前执行 print(len(segments)) 或仅打印 (segments) 。
对于阅读电子邮件标题,如果您知道它有多行,则使用 split('\n') 获得那些,然后对于每一行,如果您知道它是“名称:值”,则使用 split(':', 1)。
split 的第二个参数表示只拆分 1 个冒号,因为任何额外的冒号都可以作为数据的一部分。例如,时间戳有冒号。
def parse_subject(headers):
info = {}
# split the full header into separate lines
for line in headers.split('\n'):
# split on colon, but only once
key, value = line.split(':', 1)
# store info
info[key] = value
return info
data = """name:Contoso.Service
Source: host15
Timestamp: 2019-01-22T00:00:43.901Z
Message:null"""
print (parse_subject(data))
{'name':'Contoso.Service','Source':'host15','Timestamp':'2019-01-22T00:00:43.901Z','Message':'null'}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句