在python中将普通文件名与fnmatch模式分开
我的python函数有一个(长)的路径参数列表,每个参数都可能是一个glob。我使用在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
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分钟运行时间内,每个目录只列出一次。它们只有很多,而且每个列表都很慢。