我的python函数给出了一个(长)路径参数列表,每个路径参数都可以是一个glob。我使用glob.glob
对此列表进行了传递,以提取所有匹配的文件名,如下所示:
files = [filename for pattern in patterns for filename in glob.glob(pattern)]
这样可行,但是我所使用的文件系统在目录列表操作方面的性能非常差,目前这个操作在程序的启动时间增加了大约一分钟(!)。因此,我只想对非平凡的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
给定的字符串是否是一个非平凡的模式,但我看不出怎么做。
作为一个后备,我想我可以尝试自己识别字符串中的这些模式,虽然这感觉很像重新发明轮子,并且容易出错。但这感觉就像应该有一个优雅的解决方案。
答案 0 :(得分:1)
根据the fnmatch source code,它识别的唯一特殊字符是*
,?
,[
和]
。因此,任何不包含任何这些模式的模式只会匹配自身。因此,我们可以将问题中提到的cheapglob
实现为
def cheapglob(s): return glob.glob(s) if re.search("[][*?]", s) else [s]
这只会触及包含特殊字符的模式的文件系统。这与普通glob.glob
略有不同:对于没有像“foo.txt”这样的特殊字符的模式,无论该文件是否存在,此函数都将返回["foo.txt"]
,而glob.glob
将返回如果文件不存在,则[]
。因此调用函数需要处理一些返回文件可能不存在的可能性。
答案 1 :(得分:-1)
我认为你不会发现太多,因为你对一个微不足道的模式的想法可能不是我的。此外,从comp-sci的角度来看,可能无法从检查中判断下推自动机是否会在给定运行它的输入的情况下在设定的时间内运行,而不是针对这些输入实际运行它
我强烈怀疑你最好在这里加载一次目录列表,然后手动对该列表应用fnmatch
。