在python中将普通文件名与fnmatch模式分开

在python中将普通文件名与fnmatch模式分开,python,glob,fnmatch,Python,Glob,Fnmatch,我的python函数有一个(长)的路径参数列表,每个参数都可能是一个glob。我使用glob.glob遍历此列表以提取所有匹配的文件名,如下所示: files = [filename for pattern in patterns for filename in glob.glob(pattern)] 这是可行的,但是我所在的文件系统对于目录列表操作的性能非常差,目前这个操作使我的程序的启动时间增加了大约一分钟(!)。因此,我只想对非平凡的glob模式(即那些不只是普通路径名的模式)执行gl

我的python函数有一个(长)的路径参数列表,每个参数都可能是一个glob。我使用
glob.glob
遍历此列表以提取所有匹配的文件名,如下所示:

files  = [filename for pattern in patterns for filename in glob.glob(pattern)]
这是可行的,但是我所在的文件系统对于目录列表操作的性能非常差,目前这个操作使我的程序的启动时间增加了大约一分钟(!)。因此,我只想对非平凡的glob模式(即那些不只是普通路径名的模式)执行glob扩展,以加快速度。即

def cheapglob(pattern):
    return [pattern] if istrivial(pattern) else glob.glob(pattern)
files  = [filename for pattern in patterns for filename in cheapglob(pattern)]
由于
glob.glob
基本上是一组目录列表加上
fnmatch.fnmatch
,我想应该可以问
fnmatch
一个给定的字符串是否是一个非平凡的模式,但我不知道如何做到这一点


作为回退,我想我可以自己尝试在字符串中识别这些模式,尽管这感觉很像是重新发明轮子,而且很容易出错。但这似乎是应该有一个优雅的解决方案的事情。

我认为你不会找到太多,因为你关于琐碎模式的想法可能不是我的。此外,从comp sci的角度来看,如果不实际运行下推自动机,则可能无法从检查中判断下推自动机是否会在给定的时间内运行

我强烈怀疑您最好在这里加载一次目录列表,然后对该列表手动应用
fnmatch

根据,它识别的唯一特殊字符是
*
[
]
。因此,任何不包含这些内容的模式都只会匹配自身。因此,我们可以将问题中提到的
cheapglob
实现为

def cheapglob(s): return glob.glob(s) if re.search("[][*?]", s) else [s]
这只会影响包含特殊字符的模式的文件系统。这与普通的
glob.glob
有细微的区别:对于没有特殊字符(如“foo.txt”)的模式,无论该文件是否存在,该函数都将返回
[“foo.txt”]
,而
glob.glob
如果该文件不存在,则返回
[]
。因此,调用函数将需要处理某些返回文件可能不存在的可能性。

那么,“一个没有字符且
fnmatch
识别为特殊字符的模式”如何?那些只会匹配他们自己。这是一个定义明确的问题。我并不是只有一个目录可以一劳永逸地列出。这不是问题。在我在问题中提到的1分钟运行时间内,每个目录只列出一次。它们只有很多,而且每个列表都很慢。