使用Python优化查找前10个最近创建的文件

时间:2012-10-06 11:27:04

标签: python algorithm

我正在尝试使用Python找到从目录树中提取最近(例如10个)创建文件的最佳方法。我找到了一些[1,2]有趣的解决方案,但是,它们只涉及一个文件。

                      ├── d1
                      │   ├── d1-1
                      │   ├── d1-1
                      :
                      ├── d2
                      │   ├── d2-1
                      │   └── d2-2
                      │   │   ├── f1.xxx
                      : :
                      │   │   ├── fn.xxx
                      ├── d3
                      │   ├── d3-1
                      :
                      :

此刻,我能想到的唯一方法就是通过循环遍历同一棵树来迭代地追加结果,直到我想要10个结果;这种方法的问题在于它显然是耗时的......特别是我的目录树可能很大。我想到的替代解决方案涉及解析整个目录树并生成具有相应创建或修改日期的文件名路径,然后可能使用该“索引”文件来获取前10个最近的文件。数据库可能在这里很有用,但是,目前它不是一个选项。

有谁知道实现这一目标的最佳方式?

[1] Python return filepath/filename of most recent csv file stored in directory
[2] Find the most recent file in a directory without reading all the contents of it

2 个答案:

答案 0 :(得分:4)

你可以编写一个生成器函数来返回创建时间和文件名,并使用heapq模块自动跟踪最新的'n'条目 - 例如:

import os
import heapq

def iterfiles(root):
    for base, dirs, files in os.walk(root):
        for filename in files:
            fullname = os.path.join(base, filename)
            yield os.stat(fullname).st_ctime, fullname

print heapq.nlargest(10, iterfiles('some path here'))

暂且不说 - 如果没有权限来统计文件,您可能必须处理IOError(尝试/除了收益率)。

答案 1 :(得分:1)

import os
import heapq

basedir = ???

files = (os.path.join(x[0], fn) for x in os.walk(basedir) for fn in x[2])
print heapq.nlargest(10, files, key=lambda x:os.stat(x).st_ctime)