Python获取指定扩展名目录中最新的文件

15

我正在尝试使用“upload”目录中扩展名为“.log”的最新文件来进行Python处理。我使用Ubuntu Web服务器,并通过html脚本上传文件。上传的文件由Python脚本处理,结果被写入MySQL数据库。我使用了这个答案中的代码。

import glob
newest = max(glob.iglob('upload/*.log'), key=os.path.getctime)
print newest
f = open(newest,'r')

但是这并不会获取目录中最新的文件,而是获取最旧的一个。为什么?


3
尝试使用min代替max - 逻辑上的相反 - Jon Clements
当我从Python交互式控制台运行它时,它会给我最新的文件。 - Himanshu
1
考虑一下,你可能想要使用 os.path.getmtime - 创建时间和修改时间是不同的... 所以... 不太确定。 - Jon Clements
@Jon Clements:哇..:) 问题出在min和max上...将其更改为min,然后它就起作用了..非常感谢。 - Nilani Algiriyage
1
@Jon Clements:您能否将此作为答案发布,这样我就可以接受它了。 - Nilani Algiriyage
@NilaniAlgiriyage 好的,已经发布了...我认为这里存在一个 XY 问题,但如果它能帮到你,并结束这个问题,那对我来说没问题 :) - Jon Clements
2个回答

23

问题在于 max 的逻辑反义词是 min

newest = max(glob.iglob('upload/*.log'), key=os.path.getctime)

对于您的目的,应该是:

newest = min(glob.iglob('upload/*.log'), key=os.path.getctime)

3
新手寻找最新文件的方法需要小心,因为max getctime应该是最新日期,因此是最新的。我发现在Linux上的AMD64和树莓派上,max会给出最新的文件。想知道这里发生了什么。 - Paul
@Paul 确实...我记得当我回答这个问题时,我认为 OP 的方法是正确的,并建议使用 min 而不是 max,这只是一个建议,看看他们是否想要最旧的(或者只是看看相反的是不是他们真正想要的)... - Jon Clements
@JonClements 你好,我正在做类似的事情,需要获取某种文件格式,必须是最新的并且在目录中。想知道是否有任何方法可以仅使用 os 模块而不使用 glob 来完成这个任务? - yan
@Yan,我想你可以考虑使用 os.listdir(),但是这样你就得自己进行模式匹配了。 - Jon Clements
1
似乎每个结果都适用于特定的操作系统。提醒人们注意这一点可能是个好主意。你的回答让我花了很多时间去弄清楚我做错了什么,最后才意识到第一个选项对我有效。 - orenma
由于 ctime 在 Windows 和 Unix 上的定义不同,因此 mtime 是否更具平台独立性?对我来说,newest = max(glob.iglob('upload/*.log'), key=os.path.getmtime) 看起来效果很好。 - craq

1

在许多新程序中,使用pathlib来完成这个非常常见的任务是首选:

from pathlib import Path

XLSX_DIR = Path('../../somedir/')
XLSX_PATTERN = r'someprefix*.xlsx'

latest_file = max(XLSX_DIR.glob(XLSX_PATTERN), key=lambda f: f.stat().st_ctime)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接