【发布时间】:2020-10-25 08:35:27
【问题描述】:
所以,我有以下应用程序...
我有一个文件夹,里面有一万多个文件夹。 每个文件夹都是一个作业,它们都具有相同的格式:
“十位数字”+_+“工作名称”
像这样:
“1234567890_Stackoverflow”
我怎样才能找到只有前 10 位数字的该文件夹的全名?
这是我的 Python 代码:
其中path 是我当前的工作目录,job 是我要查找的十位数字
for dirs in os.listdir(path):
if fnmatch.fnmatch(dirs, job+"*"):
job_name = dirs
break
job_path=path+'\\'+job_name
print(job_path)
使用此代码,我可以找到工作的全名,但无论我要求哪个工作,它总是需要 23 秒才能找到。
有没有更快的方法找到它?
我的意思是,如果我手动进入作业的文件夹,我可以在 4-5 秒内搜索文件夹,但手动搜索。
【问题讨论】:
-
你试过标准Python库函数str.startswith,而不是fnmatch吗?您无需进行通配符模式匹配,因为您确切知道前 10 个字符是什么。
-
是的,我也试过了,但总是需要 23 秒
-
@PaulCornelius,你知道是否可以用我的路径和工作编号构建一个字符串,得到一个像这样的字符串 "\\mypath\123456789* 然后寻找它们而不需要读取并匹配我路径中的所有文件夹?
-
如果您在 Windows 上,您可以尝试使用像 123456789* 这样的参数作为子进程启动“dir”(请参阅 Jonatan 的回答)。不知道会不会更快。您需要弄清楚您是否受到操作系统或 listdir 功能的限制。如果在命令行输入“dir 0123456789*”,需要多长时间?如果将 print(dirs) 语句作为循环中的第一条语句,那么在第一行输出出现之前需要多长时间?奇怪的是,它总是需要 23 秒,无论是列表中的第一个还是最后一个。
-
@PaulCornelius,嘿,我想我找到了真正的问题,程序总是需要 23 秒的原因是路径是网络驱动器。我正在检查这一点,我注意到该程序需要大约 22.5 秒才能获得
os.listdir(),然后只需 0.5 秒即可获得所需的路径。
标签: python path operating-system listdir fnmatch