此功能以电子邮件正文为输入,并分别在应用程序名称,源和消息之后返回值,并且工作正常
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:Clarion.MarketSnapService
Source: p2prog15
Timestamp: 2019-01-22T00:00:43.901Z
Message:null
到parse_subject(line)
函数并从上面的输出中获得:
Clarion.MarketSnapService
作为job_info['appname']
的值
p2prog15
作为jobinfo['source']
null
作为jobinfo['message']
的值
答案 0 :(得分:0)
在您的代码中,您需要对其进行调试。错误是在告诉您到底是什么问题。
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")
您可能已经完成打印(len(段))或仅在知道错误所在的位置之前进行了打印(段)。
对于阅读电子邮件标题,如果知道它具有多行,则使用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:Clarion.MarketSnapService
Source: p2prog15
Timestamp: 2019-01-22T00:00:43.901Z
Message:null"""
print (parse_subject(data))
{'name':'Clarion.MarketSnapService','Source':'p2prog15','Timestamp':'2019-01-22T00:00:43.901Z','Message':'null'}