我有一个文件夹(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:Usersjrange14DesktopJobs"
#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:Usersjrange14DesktopJobs
所需文件夹的全名:
888_jtjdt
以及前两个的总和,以获取该文件夹的完整路径:
C:Usersjrange14DesktopJobs888_jtjdt
问题是这段代码需要很长时间才能获得这个答案,因为文件夹内有许多文件夹(超过 900 个(,并将每个文件夹与输入匹配。
从我所看到的,我的问题在这里:
#Look in the directory
for dirs in os.listdir():
if fnmatch.fnmatch(dirs, job+"*"):
#print(dirs)
job_name = dirs
有了这个for
我看到它遍历了整个目录,寻找我们输入的匹配项。 即使程序找到所需的文件夹,它也会继续在整个目录中寻找另一个文件夹
由于每个作业的前三个数字彼此不同,因此无需继续寻找其他可能的匹配项。
我该怎么做才能在第一场比赛中停止程序?
使程序更快的解决方案是使用生成器。无论何时找到实际文件,使用os.listdir()
都将花费几乎相同的时间,因为它不是生成器,它不会在每次迭代期间生成每个结果,它会首先将所有文件列出到内存中,然后循环访问它们。
使用path.py
:
from path import Path
eng_path = r"C:Usersjrange14DesktopJobs"
d = Path(eng_path)
job = "888"
for dirs in d.dirs(f'{job}_*'):
print(dirs)
break
你能试一试吗?
import os
#Job to find
job_number = "888_"
#This is the folder where all the "jobs" are
eng_path=r"C:Usersjrange14DesktopJobs"
#Look in the directory
job_name = None
for entry in os.listdir(eng_path):
if entry.startswith(job_number):
job_name = entry
break
if job_name is None:
print("Job number not found")
else:
job_path=eng_path+'\'+job_name
print(job_path)