如何监控 CSV 文件的变化?

How to monitor a CSV file for changes?

我正在尝试监视正在由单独程序写入的 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()

这会运行,但会到处查找文件中的更改。我如何让它监听一个文件的变化?

我认为这是一个 CSV 文件,使用 pandas 读取文件并检查文件大小会有所帮助。在使用 pandas

读取 csv 后,您可以使用 df.tail(2) 打印最后两行

如果除了跟踪一堆文件之外,您对脚本或多或少感到满意,那么您可以更改 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 的函数,以便它知道有多少行是新的。