@Hanharr

Как еще можно обратиться к предыдущей строке при переборе файла?

Всем доброго времени суток.

Подскажите, написал несложный парсер лог-файла fetchmail. Результатом анализа является словарь. Суть в том, что я искал строку в которой есть подстрока 'Domain not found', из неё получал почтовый адрес и мне нужна была еще предыдущая строка, строка в которой указано для какого пользователя выполнялось действие:
fetchmail: reading message manager@domain.ru@imap.yandex.ru:1 of 1 (1515 header octets) (log message incomplete)
fetchmail: SMTP error: 450 4.1.8 <postmaster@domain.local>: Sender address rejected: Domain not found


Алгоритм получился такой:
previos_str = ''

with open(logfile, 'r', encoding='utf-8') as log:
    for line in log.readlines():
        if 'Domain not found' in line:
            if previos_str:
                recipient_addr = previos_str.split('fetchmail: reading message ', 1)[1].split('@imap.yandex.ru')[0]
                sender_addr = line.split('fetchmail: SMTP error: 450 4.1.8 <', 1)[1].split('>: Sender address rejected: Domain not found')[0]

                if recipient_addr not in result_parse:
                    result_parse.setdefault(recipient_addr, [sender_addr])
                elif sender_addr not in result_parse[recipient_addr]:
                    result_parse[recipient_addr].append(sender_addr)

        previos_str = line


Меня смущает костыль previos_str = line. Можно как-то еще обратиться к предыдущей строке?
  • Вопрос задан
  • 123 просмотра
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
from itertools import zip_longest

with open(logfile, encoding='utf-8') as fh:
    for p, n in zip_longest(fh, fh):
        ...

В p предыдущая строка, в n следующая. Надо только учитывать, что в конце файла n будет равна None.
Ответ написан
Jossnix
@Jossnix
tester
Roman Ratkin, Поэкспериментировал с массивом строк, всё отработало
openedFile = ['aaa', 'bbb', 'ccc', 'xxx']

for index, line in enumerate(openedFile):
        if 'c' in line:
            if (openedFile[index-1]):
                print(openedFile[index-1])


В вашем случае, можно попробовать немного изменить код
with open(logfile, 'r', encoding='utf-8') as log:
    tmpLog = log.readlines()
    for index, line in enumerate(tmpLog)):
        if 'Domain not found' in line:
            if (tmpLog[index-1]):
                ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы