在Python中动态读取更新的文件

时间:2011-03-29 17:52:56

标签: python parsing kqueue file-monitoring

我正在编写两个解析文件的Python脚本。一个是标准的unix日志文件,另一个是二进制文件。我正在试图找出监控这些内容的最佳方法,以便我们可以在更新后立即读取数据。到目前为止我发现的大多数解决方案都是特定于Linux的,但我需要在FreeBSD中使用它。

显然,一种方法是每隔X时间运行我的脚本,但这看起来很粗糙且效率低下。如果我希望我的Python应用程序在后台连续运行,监视文件并在更改/更新后对其执行操作,那么我最好的选择是什么?

2 个答案:

答案 0 :(得分:2)

我曾经为Python内置的解析器制作了一种守护进程。我需要观看一系列文件并用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

它看起来不像顶级代码,但效果很好。

还有其他有关此问题,但我不知道他们是否会直接回答您的问题:

How to implement a pythonic equivalent of tail -F?

How do I watch a file for changes?

How can I "watch" a file for modification / change?

希望这有帮助!

答案 1 :(得分:2)

您是否尝试过KQueue事件?

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

kqueue是inotify的FreeBSD / OS版本(文件更改通知服务)。我没有用过这个,但我认为这就是你想要的。