在 Python 中使用 os.stat() 结果时如何忽略隐藏文件?



我正在尝试获取特定目录的最后修改时间(os.stat.st_mtime(。我的问题是我添加了一些隐藏的元数据文件(它们以.开头(。如果我使用os.stat(directory).st_mtime我会得到更新元数据文件的日期,而不是在目录中修改非隐藏文件的日期。我想获取除隐藏元数据文件之外的目录中所有其他文件的最新修改时间。

我认为可以编写自己的函数,大致如下:

for file in folder:
if not file starts with '.':
modified_times.append(os.path.getmtime('/path/to/file')
last_time = most recent of modified_times

但是,是否可以在 python 中原生执行此操作?还是我需要像上面的伪代码一样编写自己的函数(或类似这个问题的东西(?

你想要的结果是不可能的。所有非隐藏文件的最近修改时间不一定对应于虚拟的"忽略隐藏文件的目录的上次修改时间"。问题是,当文件移入和移出目录时,目录会修改,但文件时间戳不会更改(文件已移动,但未修改(。因此,您提出的解决方案充其量是启发式的;你可以希望它是正确的,但没有办法确定。

无论如何,不,没有内置功能可以提供这种启发式方法。隐藏文件与非隐藏文件的概念取决于操作系统和文件系统,Python 没有提供关心区别的内置 API。如果你想做一个"last_modified_guess"函数,你必须自己编写它(为了提高效率,我建议基于os.scandir(。

简单如下:

last_time = max(entry.stat().st_mtime for entry in os.scandir(somedir) if not entry.name.startswith('.'))

将为您提供非隐藏目录条目的最近上次修改时间(以纪元以来的秒为单位(。

更新:经过进一步思考,glob模块确实包括.前缀的概念,意思是"隐藏",因此您可以使用os.path.join(somedir, '*')glob.glob/glob.iglob来让它为您过滤掉"隐藏"文件。也就是说,通过这样做,你放弃了os.scandir的一些潜在好处(免费或缓存stat结果,免费类型检查等(,所以如果你只需要"隐藏"过滤,一个简单的.startswith('.')检查是不值得放弃的。

最新更新