Python中最新更新的文件列表

时间:2018-10-18 12:08:26

标签: python python-3.x

因此,使用以下代码,我可以轻松地在文件夹中找到最新更新的文件:

files = os.listdir(UPLOAD_DIR+"/"+configData[obj]["client_name"])
paths = [os.path.join(UPLOAD_DIR+"/"+configData[obj]["client_name"], basename) for basename in files]
file = max(paths, key=os.path.getctime)

但是,如果有两个或多个文件具有完全相同的更新时间怎么办?如何获得此类文件的列表?

3 个答案:

答案 0 :(得分:3)

最短的代码:找到最新的ctime,然后获取具有最新ctime的所有文件:

def most_recent(paths):
    if not paths:
        return []
    latest_ctime = max(os.path.getctime(p) for p in paths)
    most_recent_files = [p for p in paths if os.path.getctime(p)==latest_ctime]
    return most_recent_files

但是,我们在路径列表中循环了两次,如果在两个循环之间更改了最新文件的ctime,则存在竞争状态的风险:在这种情况下,第二个循环中不会再次找到它循环。

我们可以用一个更多的代码在一个循环中完成操作,从而消除竞争条件:

def most_recent_one_loop(paths):
    out = []
    latest_ctime = 0
    for p in paths:
        ct = os.path.getctime(p)
        if ct > latest_ctime:
            latest_ctime = ct
            out = [p]
        elif ct == latest_ctime:
            out.append(p)
    return out

正如我们所期望的,这大约快一倍(测试文件夹中大约100条路径):

%timeit most_recent(paths)
# 1000 loops, best of 3: 477 µs per loop

%timeit most_recent_one_loop(paths)
# 1000 loops, best of 3: 239 µs per loop

答案 1 :(得分:0)

可能不是最简洁的方法,但是:

maxval = os.path.getctime(max(paths, key=os.path.getctime))

indices = [index for index, val in enumerate(paths) if os.path.getctime(val) == maxval]
for index in indices:
    print(paths[index])

答案 2 :(得分:0)

对于Python 3,好像Python 3 docs明确指出了:max方法无法解决您的问题:

  

如果最大多个项目,则该函数返回遇到的第一个项目。这与sorted(iterable,key = keyfunc,reverse = True)[0]和heapq.nlargest(1,iterable,key = keyfunc)等其他排序稳定性保持工具一致。

您可能需要使用sorted命令来找到多重最大值

list = sorted(paths, key=os.path.getctime, reverse=True)
files=[]
for i in list:
  if os.path.getctime(list[0]) == os.path.getctime(i):
    files.append(i)
  else:
    break