gpt4 book ai didi

python - 查找子目录路径的最有效方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:10 30 4
gpt4 key购买 nike

假设我有以下目录结构

PROJECT
|
+ BUILD
| |
| + STH1
| | |
| | + 6.11.2
| | |
| | + 6.11.3
| | |
| | + .....
| + STH2
| | |
| | + 6.11.2
| | |
| | + 6.11.3
| | |
| | + .....
+ COMMON
| |
| + 6.11.2
| |
| + ....

在 python 的 PROJECT 目录中找到所有 6.11.2 目录的最有效方法是什么?

我试过用

glob.glob('PROJECT/**/6.11.2', recursive=True)

它可以工作,但对我来说不是最好的解决方案,因为它还会查找像这样的目录

PROJECT/BUILD/STH1/6.11.2/6.11.2

所以需要很多时间,我只需要找到第一个出现的目录6.11.2,所以深入搜索是浪费时间(还有像sth/6.11.2/6.11.2这样的情况会在我的结构中没有发生)

有没有更好的方法在 python 中进行搜索?

请注意,6.11.2 也是一个非常复杂的目录,包含大量文件和子目录,这就是为什么递归搜索需要花费大量时间。

最佳答案

如果我没理解错的话,你不想找到具有相同 basename 的目录。 , 是这样吗?如果是,那么这应该可以解决问题:

import os
from collections import deque
from typing import List, Set


def scandir_only_dirs(path: str) -> List[str]:
return [f.path for f in os.scandir(path) if f.is_dir()]


def scandir_no_same_basename(path: str) -> Set[str]:
result = set()
queue = deque(scandir_only_dirs(path))

if not queue:
return result

visited_basenames = set()

while queue:
currdir = queue.popleft()
basename = os.path.basename(currdir)
if basename not in visited_basenames:
result.add(currdir)
queue.extendleft(scandir_only_dirs(currdir))
visited_basenames.add(basename)

return result

对于您的示例目录树,此函数返回:

{'.\\build',
'.\\build\\sth1',
'.\\build\\sth2',
'.\\build\\sth2\\6.11.2',
'.\\build\\sth2\\6.11.3',
'.\\common'}

当然可以根据您是否希望考虑 basename 以外的其他部分来修改此算法,但总体思路是执行 traversal。并确定“访问过”的标准是什么。

编辑

添加下面的答案是因为我误解了问题:

def find_paths_to_dir(dir_basename: str, from_path: str=".") -> Set[str]:
result = set()
queue = deque(scandir_only_dirs(from_path))

if not queue:
return result

while queue:
currdir = queue.popleft()
basename = os.path.basename(currdir)
if basename == dir_basename:
result.add(currdir)
else:
queue.extendleft(scandir_only_dirs(currdir))

return result

关于python - 查找子目录路径的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58560710/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com