【问题标题】:How to improve searching with os.walk and fnmatch如何使用 os.walk 和 fnmatch 改进搜索
【发布时间】:2012-05-18 22:04:21
【问题描述】:

我正在使用os.walkfnmatch 和过滤器来搜索电脑硬盘中的所有图像文件。这工作得很好,但非常慢,因为搜索 +-70000 张图像大约需要 9 分钟。

关于优化此代码以更快运行的任何想法? 还有其他建议吗?

顺便说一下,我使用的是 python 2.7.2。

import fnmatch
import os

images = ['*.jpg', '*.jpeg', '*.png', '*.tif', '*.tiff']
matches = []

for root, dirnames, filenames in os.walk("C:\\"):
    for extension in images:
        for filename in fnmatch.filter(filenames, extension):
            matches.append(os.path.join(root, filename))

【问题讨论】:

    标签: python image search os.walk


    【解决方案1】:

    我不是那些总是求助于re 锤子来解决所有问题的正则表达式狂人之一,但在我的测试中,这实际上比你的 fnmatch 版本快两倍多:

    import os
    import re
    
    matches = []
    
    img_re = re.compile(r'.+\.(jpg|png|jpeg|tif|tiff)$', re.IGNORECASE)
    
    for root, dirnames, filenames in os.walk(r"C:\windows"):
        matches.extend(os.path.join(root, name) for name in filenames if img_re.match(name))
    

    【讨论】:

      【解决方案2】:

      Python 在我看来还不错。

      你可以尝试

      for root, dirnames, filenames in os.walk("C:\\"):
          for extension in extensions:
              matches.extend(os.path.join(root, filename) for filename 
                             in fnmatch.filter(filenames, extension))
      

      如果这没有影响(我想不会),我相信您的硬盘已成为该过程中的瓶颈(请记住,磁盘 == 慢,并且您正在迭代并列出每个目录的文件你的系统)。

      如果硬盘瓶颈,那么多个dir /s ...语句的结果肯定不会比Python解决方案快得多。

      【讨论】:

      • @Levon:感谢您的关注,编辑了我的答案以修复缩进。
      【解决方案3】:
      import os
      extns = ('.jpg', '.jpeg', '.png', '.tif', '.tiff')
      matches = []
      for root, dirnames, fns in os.walk("C:\\"):
          matches.extend(
              os.path.join(root, fn) for fn in fns if fn.lower().endswith(extns)
              )
      

      【讨论】:

      • 之前没有注意到 endwith 接受一个元组。将此与重新版本进行比较,它们已经足够接近,我会说任何一个都可以。
      猜你喜欢
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 2020-03-06
      相关资源
      最近更新 更多