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

在Python中使用os.stat()结果时如何忽略隐藏文件?,python,python-2.7,python-os,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

我试图获取某个特定目录的上次修改时间(
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”函数,你必须自己编写(为了效率,我推荐)

简单到:

last_time = max(entry.stat().st_mtime for entry in os.scandir(somedir) if not entry.name.startswith('.'))
将获取非隐藏目录项最近一次修改的时间(从纪元开始以秒为单位)


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

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

在任何情况下,都没有提供这种启发式的内置程序。隐藏文件与非隐藏文件的概念取决于操作系统和文件系统,Python没有提供关心这一区别的内置API。如果你想做一个“last_modified_guess”函数,你必须自己编写(为了效率,我推荐)

简单到:

last_time = max(entry.stat().st_mtime for entry in os.scandir(somedir) if not entry.name.startswith('.'))
将获取非隐藏目录项最近一次修改的时间(从纪元开始以秒为单位)


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

隐藏文件只是一个文件,其名称以句点开头,默认情况下不会显示在
ls
中。换句话说,它是
ls
(或任何其他文件管理器)的功能,而不是文件的功能。如果您想忽略隐藏文件,您必须通过在问题或类似内容中编写代码来“教授”Python。
modified_times=[os.path.getmtime(f)for f in folder If f[0]!='.]
您编写的内容很好。您可以做的一个小改进是不在内存中构建列表(通过将生成器表达式传递给
max
函数,或者如果val>=max:max=val在循环中执行
,而不是
append
,或其他任何操作)。但考虑到目录中很少有超过几千个文件,1000次统计调用的成本远远超过分配一个小列表的成本,我不担心这一点。但与此同时,如果这是你需要经常做的事情(比如说,从现在到时间结束,每20分钟一次),您可能需要设置kqueue/inotify/FSEvents/FindFirstChangeNotification watcher,以便在文件被触摸时更新时间,除非文件被隐藏,因此您只需在启动时扫描一次,然后再也不扫描(除非程序重新启动)。隐藏文件只是名称以句点开头的文件,默认情况下,
ls
不会显示该文件。换句话说,它是
ls
(或任何其他文件管理器)的功能,而不是文件的功能。如果您想忽略隐藏文件,您必须通过在问题或类似内容中编写代码来“教授”Python。
modified_times=[os.path.getmtime(f)for f in folder If f[0]!='.]
您编写的内容很好。您可以做的一个小改进是不在内存中构建列表(通过将生成器表达式传递给
max
函数,或者如果val>=max:max=val
在循环中执行
,而不是
append
,或其他任何操作)。但是考虑到目录很少有超过几千个文件,1000次统计调用的成本远远超过分配一个小列表的成本,我会