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

时间:2018-06-19 23:59:51

标签: python python-2.7 python-os

我正在尝试获取特定目录的上次修改时间(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的东西)?

1 个答案:

答案 0 :(得分:3)

您想要的结果是不可能的。所有非隐藏文件的最新修改时间不一定与虚拟的“忽略隐藏文件的目录的最后修改时间”相对应。问题在于,目录在文件移入和移出时都会被修改,但文件时间戳未更改(文件已移动,但未修改)。因此,您建议的解决方案充其量只能是一种启发式方法。您可以<希望>希望是正确的,但是无法确定。

无论如何,没有,没有内置的程序可以提供这种启发。隐藏文件和非隐藏文件的概念取决于操作系统和文件系统,并且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确实包含了.前缀(意为“隐藏”)的概念,因此您可以使用glob.glob / {{1 glob.iglob中的}},以便为您过滤掉“隐藏”的文件。也就是说,这样做会放弃os.path.join(somedir, '*')的某些潜在好处(免费或缓存的os.scandir结果,免费类型检查等),因此,如果您需要的只是“隐藏”过滤,简单的stat检查就不值得放弃。