在Python中实时读取更新文件

2 投票
2 回答
3490 浏览
提问于 2025-04-16 14:40

我正在写两个Python脚本,它们都用来解析文件。一个是标准的Unix日志文件,另一个是二进制文件。我想找出最好的方法来监控这些文件,以便在它们更新时能立即读取数据。我发现的大部分解决方案都是针对Linux的,但我需要在FreeBSD上运行这个。

显然,一个方法就是每隔一段时间就运行我的脚本,但这样感觉很麻烦,也不高效。如果我想让我的Python应用程序在后台持续运行,监控一个文件,并在文件发生变化或更新时进行处理,最好的办法是什么呢?

2 个回答

2

我曾经写过一个程序,用来监视一系列文件,并用Python处理它们。这是一个类似守护进程的程序,能够在多个操作系统上运行(这次是Windows和Linux)。我写的程序会检查文件的修改时间,来判断文件是否有变化。程序会先休眠一段时间,然后再检查这些文件的修改时间。如果发现某个文件的修改时间比之前记录的时间要新,那就说明这个文件发生了变化,这时就需要对这个文件进行处理。

大概是这样的:

import os
import time

path = os.path.dirname(__file__)
print "Looking for files in", path, "..."

# get interesting files
files = [{"file" : f} for f in os.listdir(path) if os.path.isfile(f) and os.path.splitext(f)[1].lower() == ".src"]
for f in files:
    f["output"] = os.path.splitext(f["file"])[0] + ".out"
    f["modtime"] = os.path.getmtime(f["file"]) - 10
    print "  watching:", f["file"]


while True:
    # sleep for a while
    time.sleep(0.5)
    # check if anything changed
    for f in files:
        # is mod time of file is newer than the one registered?
        if os.path.getmtime(f["file"]) > f["modtime"]: 
            # store new time and...
            f["modtime"] = os.path.getmtime(f["file"])
            print f["file"], "has changed..."
            # do your stuff here

虽然代码看起来不是特别完美,但实际上运行得挺不错的。

关于这个问题,StackOverflow上还有其他的讨论,但我不确定那些讨论是否能直接回答你的问题:

如何实现Python版的tail -F?

我该如何用Python监视文件的变化?

我该如何“监视”文件的修改/变化?

希望这些对你有帮助!

2

你试过KQueue事件吗?

http://docs.python.org/library/select.html#kqueue-objects

kqueue是FreeBSD和其他操作系统用来监控文件变化的工具,类似于inotify(文件变化通知服务)。我自己没有用过这个,但我觉得这可能是你需要的东西。

撰写回答