首页 > 解决方案 > 在第一次匹配时停止搜索,在 +900 个文件夹 PYTHON 的文件夹中

问题描述

我有一个文件夹(C:\Users\jrange14\Desktop\Jobs),里面有 900 多个文件夹,格式如下:

“三个数字”+“_”+“工作名称”

示例:888_jtjdt

我想做一个搜索,用户只需要询问一个名为 JOB 的三位数输入,程序将搜索整个文件夹并找到所需的文件夹,只有文件夹的前 3 个字符。

这是获取该文件夹路径的 Python 代码:

import os
import fnmatch

#Job to find
job = "888"

#This is the folder where all the "jobs" are
eng_path=r"C:\Users\jrange14\Desktop\Jobs"

#Define the path in which we will work
os.chdir(eng_path)
path = os.getcwd()
print(path)

#Look in the directory
for dirs in os.listdir():

    if fnmatch.fnmatch(dirs, job+"*"):
        #print(dirs)
        job_name = dirs

job_path=eng_path+'\\'+job_name

print(job_path)

使用此代码,我可以获得 3 件事,工作目录:

C:\Users\jrange14\Desktop\Jobs

所需文件夹的全名:

888_jtjdt

以及前两者的总和以获得该文件夹的完整路径:

C:\Users\jrange14\Desktop\Jobs\888_jtjdt

问题是这段代码需要很长时间才能获得这个答案,因为文件夹中有很多文件夹(超过 900 个),并且每个文件夹都与输入相匹配。

从我看到我的问题在这里:

#Look in the directory
for dirs in os.listdir():

    if fnmatch.fnmatch(dirs, job+"*"):
        #print(dirs)
        job_name = dirs

有了这个for,我看到它遍历整个目录,寻找我们输入的匹配。即使程序找到所需的文件夹,它也会继续整个目录寻找另一个

由于每个工作的前三个数字彼此不同,因此无需继续寻找其他可能的匹配项。

我该怎么做才能在第一场比赛中停止程序?

标签: pythondirectorypathmatchlistdir

解决方案


使程序更快的解决方案是使用生成器。无论何时找到实际文件,使用os.listdir()都将花费几乎相同的时间,因为它不是生成器,它不会在每次迭代期间生成每个发现,它首先将所有文件列出到内存中,然后遍历它们。

使用path.py

from path import Path

eng_path = r"C:\Users\jrange14\Desktop\Jobs"
d = Path(eng_path)
job = "888"

for dirs in d.dirs(f'{job}_*'):
    print(dirs)
    break

推荐阅读