获取不断更新文件

时间:2016-04-25 22:39:31

标签: python subdirectory os.path

我找到了一些方法来搜索用户在目录中创建的最新文件,但我需要确定是否存在更简单的方法。关于这个主题的大多数帖子在某些情况下都有效,或者遇到重大障碍,所以我希望不要弄水。

我在查看不断增长的文件系统时遇到了困难,并且为更多用户带来了更多潜在错误。

我从Superlogics Winview CP 32获取连续流媒体系统的数据。在每次使用系统时,我都有操作员输入文件名的唯一标识符,其中包含我们需要跟踪的系统的一些初始条件。我希望在没有操作员/用户帮助的情况下获取该文件名。

最终,最终目标是削减我想要搜索的文件列表,根据键进行过滤,因此我的第一直觉是仅使用匹配的文件类型,将路径中的所有文件夹修剪为列表,然后排序基于最大时间戳。我在这些页面中使用了一些非常常见的函数:

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,how-to-get-the-path-of-a-running-jar-file),但需要Python中的东西。我已经探索过像watchdogwin32这样的函数,但两者都需要陡峭的学习曲线,我觉得我要么非常接近,要么完全需要改变我的范式。

1 个答案:

答案 0 :(得分:1)

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

除此之外,你真的需要一些能够监听文件系统事件的东西。一个快速谷歌出现了两个点包,pyinotify仅适用于Linux和看门狗。

希望这有帮助。