扩展列表时列表索引超出范围

时间:2019-01-22 22:12:36

标签: python for-loop while-loop

此功能以电子邮件正文为输入,并分别在应用程序名称,源和消息之后返回值,并且工作正常

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']的值

1 个答案:

答案 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'}