如何使用os.walk和fnmatch改进搜索

时间:2012-05-18 22:04:22

标签: python image search os.walk

我正在使用os.walkfnmatch过滤器来搜索pc的硬盘以查找所有图像文件。这非常好,但是非常慢,因为搜索+ -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))

3 个答案:

答案 0 :(得分:4)

我不是那些总是使用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))

答案 1 :(得分: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解决方案快得多。

答案 2 :(得分:2)

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)
        )