-->

如何改善与os.walk和搜索的fnmatch(How to improve searching w

2019-06-24 14:31发布

我使用os.walkfnmatch使用过滤器来搜索电脑硬盘上的所有图像文件。 这工作完全正常,但非常缓慢,因为它需要大约9分钟的时间查找+ -70000图像。

优化的代码运行速度更快的任何想法? 任何其他的建议?

我使用的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))

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


Answer 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的解决方案快。



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


文章来源: How to improve searching with os.walk and fnmatch