在Python中实时读取更新文件
我正在写两个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上还有其他的讨论,但我不确定那些讨论是否能直接回答你的问题:
希望这些对你有帮助!
2
你试过KQueue事件吗?
http://docs.python.org/library/select.html#kqueue-objects
kqueue是FreeBSD和其他操作系统用来监控文件变化的工具,类似于inotify(文件变化通知服务)。我自己没有用过这个,但我觉得这可能是你需要的东西。