Python неправильно сравнивает строки

Всем привет. Вчера задавал такой вопрос. Теперь появилась такая проблема: потребовалось сделать так, чтобы последняя строка сохранялась в файл и при следующем запуске скрипта анализ логов начинался только после этой строки. Но python попросту неправильно сравнивает две абсолютно одинаковые строки.

Есть два файла: last_line_log.txt, содержащий последнюю строку, и 1.log (собственно сам лог файл). Содержание 1.log:

executed: test
executed: 1
executed: 2
executed: 3
executed: 4

Содержание last_line_log.txt:

executed: 1

Сам код:

import codecs
import time

#Создаю переменную last_line из текста с файла
try:
    last_line_f = open('last_line_log.txt', 'r')
    last_logfile_line = last_line_f.readlines()
    for line in last_logfile_line:
        last_line = line
    print(last_line)
except FileNotFoundError:
    last_line = None


while True:
    print('parsing logs...') 
    f = codecs.open('logs/1.log', 'r', "utf_8_sig")
    logfile = f.readlines()
    f.close()

    #Проверяю каждую строку
    for line in logfile:
            if last_line is not None:  
                if last_line == line:
                    #Именно тут проблема, ведь текст "test" не появляется
                    last_line = None
                    print('test')

                continue
            if ('executed:' in line):
                print(line)

    print('Done')
    last_line = line
    #Запись последней строки в файл
    last_line_f = open('last_line_log.txt', 'w')
    last_line_f.write(last_line)
    last_line_f.close()
    time.sleep(10)

В итоге у меня выходит:

executed: 1
parsing logs...
Done

Если убрать в самом начале try и оставить только last_line = None, то всё будет работать так, как и должно.


Ответы (1 шт):

Автор решения: n1tr0xs

Это происходит, потому что в строках из файла 1.log содержатся символы каретки и переноса строки. Чтобы исправить проблему достаточно использовать метод strip() строк. Так же я немного оптимизировал ваш код.

import codecs
import time

#Создаю переменную last_line из текста с файла
try:
    with open('last_line_log.txt', 'r') as last_line_f:
        last_line = last_line_f.readlines()[-1]
    print(last_line)
except FileNotFoundError:
    last_line = None


while True:
    print('parsing logs...') 
    with codecs.open('logs/1.log', 'r', "utf_8_sig") as f:
        logfile = f.readlines()

    #Проверяю каждую строку
    for line in logfile:
            if last_line is not None:  
                if last_line == line.strip():
                    #Именно тут проблема, ведь текст "test" не появляется
                    last_line = None
                    print('test')

                continue
            if ('executed:' in line):
                print(line)

    print('Done')
    last_line = line
    #Запись последней строки в файл
    with open('last_line_log.txt', 'w') as f:
        f.write(last_line)
    time.sleep(10)
→ Ссылка