Как отслеживать изменения в CSV-файле? - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь отслеживать CSV-файл, который записывается отдельной программой. Примерно каждые 10 секунд файл CSV обновляется еще парой строк. Каждый раз, когда файл обновляется, я хочу иметь возможность обнаруживать, что файл был изменен (всегда будет один и тот же файл), брать новые строки и записывать их в консоль (только для теста).

Я просмотрел веб-сайт и нашел множество способов просмотра файла, чтобы узнать, обновлен ли он (например, http://thepythoncorner.com/dev/how-to-create-a-watchdog-in-python-to-look-for-filesystem-changes/), но я не могу ничего найти это позволит мне получить изменения, внесенные в файл, для вывода на консоль.

Текущий код:

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

def on_created(event):
    print(f"hey, {event.src_path} has been created!")

def on_deleted(event):
    print(f"Someone deleted {event.src_path}!")

def on_modified(event):
    print(f"{event.src_path} has been modified")

def on_moved(event):
    print(f"ok ok ok, someone moved {event.src_path} to {event.dest_path}")

if __name__ == "__main__":
    patterns = "*"
    ignore_patterns = ""
    ignore_directories = False
    case_sensitive = True
    my_event_handler = PatternMatchingEventHandler(patterns, ignore_patterns, ignore_directories, case_sensitive)
    my_event_handler.on_created = on_created
    my_event_handler.on_deleted = on_deleted
    my_event_handler.on_modified = on_modified
    my_event_handler.on_moved = on_moved
    path = "."
    go_recursively = True
    my_observer = Observer()
    my_observer.schedule(my_event_handler, path, recursive=go_recursively)
    my_observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        my_observer.stop()
        my_observer.join()

Это выполняется, но ищет изменения в файлах повсюду. Как заставить его прослушивать изменения из одного файла?

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Если вы более или менее довольны сценарием, отличным от отслеживания кучи файлов, вы можете изменить часть patterns = "*", которая является строкой сопоставления с подстановочными знаками, которая сообщает PatternMatchingEventHandler искать любой файл. Вы можете изменить это значение на paterns = 'my_file.csv', а также изменить переменную path на каталог, в котором находится файл, чтобы сэкономить время при рекурсивном сканировании всех каталогов в '.'. Тогда вам не нужно устанавливать recursive в True для одного файла.

Печатать новые строки в консольную часть (один вариант):

import pandas as pd

...

def on_modified(event):
    print(f"{event.src_path} has been modified")
    # You said "a couple more lines" I'm going to take that
    # as two:
    df = pd.read_csv(event.src_path)
    print("Newest 2 lines:")
    print(df[-2:])

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

0 голосов
/ 16 июня 2020

Я полагаю, поскольку это файл CSV, чтение файла с использованием pandas и проверка размера файла могут помочь. Вы можете использовать df.tail (2) для печати последних двух строк после чтения csv, используя pandas

...