获取持续更新文件的文件路径

Get file path of continuously updating file

我发现了几种搜索用户在目录中创建的最新文件的方法,但我需要确定是否存在更简单的方法。大多数关于此主题的帖子在某些情况下都有效或存在重大障碍,因此我希望澄清问题。

我很难查看不断增长的文件系统,也很难将更多用户带入并带来更多潜在错误。

我从 Superlogics Winview CP 32 获取连续流系统的数据。在每次使用系统时,我都会让操作员输入一个唯一的文件名标识符,其中包含一些我们需要跟踪的系统初始条件。我想在没有 operator/user.

帮助的情况下获取该文件名

最终,最终目标是减少我要搜索的文件列表,根据键过滤,所以我的第一直觉是只使用匹配的文件类型,trim 路径中的所有文件夹放入列表中,并根据最大时间戳进行排序。我使用了这些页面中的一些非常常用的函数:

def fileWalkIn(path='.',matches=[],filt='*.csv'): # Useful for walking through a given directory
    """Iterates through all files under the given path using a filter."""
    for root, dirnames, filenames in os.walk(path):

        for filename in fnmatch.filter(filenames, filt):
            matches.append(os.path.join(root, filename))
            yield os.path.join(root, filename)

def getRecentFile(path='.',matches=[],filt='*.dat'):
    rr = max(fileWalkIn(path=path,matches=matches,filt=filt), key=os.path.getmtime)
    return rr    

这让我走了很远,但是相当笨重而且速度慢,这意味着如果我想探索匹配的文件,我不能重复这样做,以免我必须携带一个庞大的匹配文件列表。

理想情况下,我将能够即时处理数据,在写入时实时执行和打印,因此这种方法在这种情况下不可用。

我从这些页面借用了 alex-martelli 的一种新方法,它不使用过滤器,提供了提供文件而不是目录的选项,比 fileWalkIn 更简洁,如果使用时间戳则工作速度更快。

def all_subdirs_of(b='.'): # Useful for walking through a given directory
    # Create hashable list of files or directories in the parent directory
    results = []
    for d in os.listdir(b):

        bd = os.path.join(b, d)
        if os.path.isfile(bd):     
            results.append(bd)
        elif os.path.isdir(bd): 
            results.append(bd)

    # return both
    return results

def newest(path='.'):

    rr = max(all_subdirs_of(b=path), key=os.path.getmtime)
    return rr

def getActiveFile(newFile ='.'):

    while os.path.exists(newFile):

        newFile = newest(newFile)
        if os.path.isfile(newFile): 

            return newFile
        else:
            if newFile:
                continue
            else:
                return newFile

这使我可以更快地获取目录中的活动文件,但前提是自启动我的数据收集后没有其他文件被写入。我可以在这里看到各种各样的问题,需要一些帮助来确定我是否陷入了困境,是否有更简单的解决方案,例如测试文件大小,或者是否存在更具凝聚力且潜在障碍更少的解决方案。

我找到了不同语言的其他答案(java,如何获取-运行-jar 文件的路径),但需要 Python。我探索过像 watchdog and win32 这样的函数,但两者都需要陡峭的学习曲线,我觉得我要么非常接近,要么需要完全改变我的范式。

dircache 可能会稍微加快第二种方法。它是 listdir 的包装器,用于检查目录时间戳,并且仅在发生更改时才重新读取目录内容。

除此之外,您确实需要侦听文件系统事件的东西。快速 google 找到了两个 pip 包,仅用于 Linux 的 pyinotify 和 watchdog。

希望对您有所帮助。