2

我的 python 函数有一个(长)路径参数列表,每个参数都可能是一个 glob。我通过这个列表glob.glob来提取所有匹配的文件名,如下所示:

files  = [filename for pattern in patterns for filename in glob.glob(pattern)]

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

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给定的字符串是否是非平凡的模式,但我不知道该怎么做。

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

4

2 回答 2

1

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

def cheapglob(s): return glob.glob(s) if re.search("[][*?]", s) else [s]

这只会命中包含特殊字符的模式的文件系统。这与普通的 略有不同glob.glob:对于没有特殊字符(如“foo.txt”)的模式,["foo.txt"]无论该文件是否存在,此函数都会返回,而如果文件不存在glob.glob则返回[]。所以调用函数需要处理一些返回的文件可能不存在的可能性。

于 2014-03-05T15:31:19.993 回答
-1

我认为您不会发现太多,因为您对琐碎模式的想法可能不是我的。此外,从 comp-sci 的角度来看,可能无法通过检查判断下推自动机是否会在给定您正在运行的输入的情况下在设定的时间内运行,而无需实际针对这些输入运行它.

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

于 2014-03-04T18:49:44.023 回答