【问题标题】:How to get the full name of a Folder with just its first 10 characters如何获取仅包含前 10 个字符的文件夹的全名
【发布时间】: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


【解决方案1】:

也许操作系统更快,你可以试试:

import subprocess
number = 54932034857
dirname = subprocess.run([f"ls -d {number}*"], 
    stdout=subprocess.PIPE,
    shell=True).stdout.decode("utf-8").split("\n")[0]
 print(dirname) 

如果您在 Windows 上,您可能可以使用 dir 而不是 ls

【讨论】:

  • 你能给我解释一下吗?
  • @JorgeRangel 如果您在 Google 上搜索“python 系统调用捕获输出”之类的内容,您会看到很多很好的解释。它有效吗?速度快吗?
【解决方案2】:

这里是你如何使用glob.glob()

from glob import glob

path = 'C:\\Users\\User\\Desktop\\Folder'
ten_digits = '1234567890'
for file in glob(f"{path}\\{ten_digits}_*"):
    print(file)

【讨论】:

  • 同样的问题,总是需要 23-24 秒,不管你要找哪个工号。
猜你喜欢
  • 2017-08-14
  • 2017-08-16
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多