因此,使用以下代码,我可以轻松地在文件夹中找到最新更新的文件:
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)
但是,如果有两个或多个文件具有完全相同的更新时间怎么办?如何获得此类文件的列表?
答案 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