Получение подкаталогов рекурсивно, но только до уровня - PullRequest
0 голосов
/ 19 февраля 2019

Я наткнулся на очень простую проблему сегодня.У меня есть структура каталогов, подобная этой:

main_dir
    |_A
       |_X
       |_Y  
    |_B
       |_X
       |_Y 
    |_C

       |_X
         |_PP
         |_QQ 
       |_Y
         |_PP 

Я хочу рекурсивно получить все подкаталоги до уровня, где присутствуют X и Y.Я не хочу включать PP и QQ в этот список.

Я пробовал это:

mai_dir = Path("main_dir")
subdirs = [x for x in iter(main_dir("**/*")) if x.is_dir()] 

Проблема с этим подходом состоит в том, что он также включает эти результаты:

main_dir/A
main_dir/B
main_dir/C
main_dir/C/X/PP
main_dir/C/Y/QQ

Я хочу исключить эти результаты.Я знаю, что могу применить другой цикл for с if-else, но мне интересно, есть ли способ избежать цикла здесь.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Как то так?

import os
path = r"c:\MyDownloads"
for root,dirs,files in os.walk(path):
    if root[len(path)+1:].count(os.sep)<2:
        print(os.path.join(root))

или вот так:

import pathlib

path = r"c:\MyDownloads"
mai_dir = pathlib.Path(path)
for i in list(mai_dir.glob("**/")):
    if len(i.parts) < len(mai_dir.parts) + 3:
        print(i)
0 голосов
/ 19 февраля 2019

* соответствует всем файлам и каталогам.Если вы хотите сопоставить только некоторые конкретные каталоги, скажите об этом явно.

mai_dir = pathlib.Path(".")
print(list(mai_dir.glob("**/[XY]/")))

Если один глобус не обрежет его, вы можете создать два или более списков и объединить их.

...