Как считывать информацию с log файла? На Python

Есть лог файл DropsSummoner.log, он периодический обновляется. Мне нужно чтобы после каждого обновления этого файла, выводилось на экран последняя строчка этого файла (я делаю уведомления в телеграм, в итоге эта строчка будет отправлена в телеграм, но эту часть я и сам могу сделать, я не могу придумать как считывать последнюю строчку после каждого обновления файла).


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

Автор решения: Сергей Ш
txt = '11\n' \
      '12\n' \
      '13\n'

print(txt.splitlines()[-1])

вывод

13
→ Ссылка
Автор решения: Стас

В этой задаче вам поможет уже отмеченный watchdog.

Пример кода (ловит изменения в файле и выводит последнюю строку измененного файла на консоль):

import time
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler

class FileChangeEventHandler(PatternMatchingEventHandler):
    def __init__(self, patterns=None, ignore_patterns=None, case_sensitive=False):
        super().__init__(
            patterns=patterns,
            ignore_patterns=ignore_patterns,
            ignore_directories=True,
            case_sensitive=case_sensitive
        ) #принудительно устанавливаем ignore_directories на True, 
          #так как нам нужны только изменения в файлах
    
    def on_modified(self, event):
        with open(event.src_path) as modifiedFile:
            for line in modifiedFile: pass
            print(line)


targetDir = "."
patterns = ("test.txt",) #укажите здесь шаблон, соответствующий отслеживаему файлу (файлам)

observer = Observer()
observer.schedule(
    event_handler = FileChangeEventHandler(patterns=patterns), 
    path = targetDir,
    recursive = False
)
observer.start()

try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    print("Stopping")
finally:
    observer.stop()
    observer.join()

  • По поводу шаблонов для файлов можете почитать тут.
  • Бесконечный цикл нужен, чтобы программа не завершилась сразу после установки watchdog. Его можно заменить какой либо полезной нагрузкой (например, bot_polling())
  • Observer работает в отдельном потоке. То есть основной поток можно занять другими операциями, не боясь, что обработка событий watchdog зависнет
→ Ссылка