Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中动态读取更新的文件_Python_Parsing_Kqueue_File Monitoring - Fatal编程技术网

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

在Python中动态读取更新的文件,python,parsing,kqueue,file-monitoring,Python,Parsing,Kqueue,File Monitoring,我正在编写两个Python脚本,它们都解析文件。一个是标准unix日志文件,另一个是二进制文件。我正试图找出监控这些数据的最佳方法,以便在数据更新后立即读取数据。到目前为止,我发现的大多数解决方案都是特定于linux的,但我需要它才能在FreeBSD中工作 显然,一种方法是每X个时间运行一次脚本,但这似乎很糟糕,效率也很低。如果我想让我的Python应用程序在后台持续运行,监视一个文件,并在文件更改/更新后对其执行操作,那么我的最佳选择是什么 我曾经为Python中内置的解析器创建了一种守护进程

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


显然,一种方法是每X个时间运行一次脚本,但这似乎很糟糕,效率也很低。如果我想让我的Python应用程序在后台持续运行,监视一个文件,并在文件更改/更新后对其执行操作,那么我的最佳选择是什么

我曾经为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
它看起来不像是顶级代码,但它工作得相当好

关于这一点,还有其他一些问题,但我不知道它们是否能直接回答您的问题:


希望这有帮助

您尝试过排队事件吗


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

对二进制文件的处理不太好:)谢谢你的回复。我希望有一个非轮询解决方案,但不确定是否可以从kqueue获得此功能。根据你的链接之一,我将结帐的看门狗,看看它是否可以帮助。