Python - 基于多个过滤器搜索文件名的有效方法

标签 python search

我有一小段代码来列出与过滤器字符串匹配的文件名。我正在尝试扩展它以匹配多个过滤器。我有一些工作代码采用了非常直接的循环方法,但它很慢......基本上为每个过滤器运行 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 编程。

  1. 如果你想针对一个字符串测试很多模式,那么你应该选择一个更好的表示结构。我们使用的不是 char 数组 suffix-trees. (对于 python 实现,请参见 this question.

  2. 如果您的某些过滤器具有共同部分(特别是如果它们具有相同的前缀),您应该将它们表示为 trie(s) .因此,您可以通过这种方式同时测试多个模式。此解决方案会产生构建树的开销,但如果您多次使用相同的过滤器,那么它是值得的。

关于Python - 基于多个过滤器搜索文件名的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27413090/

相关文章:

javascript - 如何使用 jQuery 过滤数据并在静态 HTML 中显示?

javascript - d3.js 强制定向图搜索

ios - 搜索 firebase 数据 : iOS, Swift

python - 在下一次应用迭代 python 中使用应用 fnc 的输出

Python:比较两个词典并将两者中的相同条目写入单独的文件

python - 两个类之间共享资源

python - 在 Python 中创建找到的单词数组

python - 创建未知大小的稀疏矩阵

python - GitPython - 获取未跟踪的文件

python - 重叠出现的字符串计数