индекс списка вне диапазона при расширении списка - PullRequest
0 голосов
/ 23 января 2019

Эта функция принимает тело сообщения электронной почты в качестве входных данных и возвращает значения после имени приложения, источника и сообщения соответственно, и работает нормально

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

Для другого формата тела письма мне нужно расширить формат сегментов, потому что мне нужно искать больше строк в теле сообщения, поэтому я изменил информацию ['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)):

пример сегментов: длина будет меняться, потому что строка после сообщения имеет другое значение, иногда это строка 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 голосов
/ 23 января 2019

В вашем коде вам нужно отладить его. Ошибка говорит вам, что именно не так.

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 (сегменты)) или просто напечатать (сегменты) прямо перед тем, как вы знаете, что ошибка.

Для чтения заголовка электронного письма, если вы знаете, что оно имеет несколько строк, вы получаете те с разделением ('\ n'), а затем для каждой строки, если вы знаете, что это «имя: значение», вы получаете это с помощью split (' : ', 1).

Второй аргумент для разделения говорит только о разделении на 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'}

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