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

How to ignore hidden files when using os.stat() results in Python?

我正在尝试获取特定目录的最后修改时间 (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 中本地执行此操作?或者我是否需要像上面的伪代码一样编写自己的函数(或类似 this question)?

你想要的结果是不可能的。所有非隐藏文件的最近修改时间不一定对应虚拟"last modified time of a directory ignoring hidden files"。问题是当文件移入和移出目录时,目录会被修改,但文件时间戳不会更改(文件已移动,但未修改)。因此,您提出的解决方案充其量只是一种启发式方法;你可以希望它是正确的,但无法确定。

无论如何,不​​,没有提供此启发式的内置程序。隐藏文件与非隐藏文件的概念是 OS 和文件系统相关的,Python 没有提供关心区别的内置 API。如果你想做一个"last_modified_guess"函数,你就得自己写了(为了效率我推荐basing it on os.scandir)。

简单如:

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

将为您提供非隐藏目录条目的最近修改时间(自纪元以来的秒数)。

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