我有一小段代码来列出与过滤器字符串匹配的文件名。我正在尝试扩展它以匹配多个过滤器。我有一些工作代码采用了非常直接的循环方法,但它很慢......基本上为每个过滤器运行 os.walk
。
鉴于函数(如下所示)是否有一种方法可以同时针对多个过滤器进行测试,而不是一次测试一个?即我可以将过滤字符串列表传递给 find_files
吗?
import os
import fnmatch
# stolen from http://stackoverflow.com/questions/8625991/use-python-os-walk-to-identify-a-list-of-files
def find_files(dir_look, filt):
matches = []
for root, dirnames, filenames in os.walk(dir_look):
for filename in fnmatch.filter(filenames, filt):
matches.append(os.path.join(root, filename))
return matches
#create empty list to store results
filelist=[]
#some example filters, my real data has about 5000 filters
filts = [r'*60830007*',r'*60910259*',r'*60910299*']
#find files for each filter entry
for filter in filts:
filelist.append(find_files(r'C:\some directory', filter))
编辑:
我找到了一种相当明显的方法来加快速度,方法是将过滤器列表传递给函数,然后在 os.walk 中测试每个过滤器
def find_files(dir_look, filters):
matches = []
for root, dirnames, filenames in os.walk(dir_look):
for filt in filters:
for filename in fnmatch.filter(filenames, filt):
matches.append(os.path.join(root, filename))
return matches
最佳答案
这个答案将是关于算法和数据结构的,而不是 python 编程。
如果你想针对一个字符串测试很多模式,那么你应该选择一个更好的表示结构。我们使用的不是 char 数组 suffix-trees. (对于 python 实现,请参见 this question.
如果您的某些过滤器具有共同部分(特别是如果它们具有相同的前缀),您应该将它们表示为 trie(s) .因此,您可以通过这种方式同时测试多个模式。此解决方案会产生构建树的开销,但如果您多次使用相同的过滤器,那么它是值得的。
关于Python - 基于多个过滤器搜索文件名的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27413090/