Список каталогов с заданной глубиной в Python

Я хочу, чтобы функция возвращала список с каталогами с указанным путем и фиксированной глубиной и вскоре поняла несколько альтернатив. Я использую os.walk довольно много, но код стал выглядеть уродливым при подсчете глубины и т. Д.

Какова действительно самая «аккуратная» реализация?

3 Solutions collect form web for “Список каталогов с заданной глубиной в Python”

Если глубина зафиксирована, glob – хорошая идея:

 import glob,os.path filesDepth3 = glob.glob('*/*/*') dirsDepth3 = filter(lambda f: os.path.isdir(f), filesDepth3) 

В противном случае не должно быть слишком сложно использовать os.walk :

 import os,string path = '.' path = os.path.normpath(path) res = [] for root,dirs,files in os.walk(path, topdown=True): depth = root[len(path) + len(os.path.sep):].count(os.path.sep) if depth == 2: # We're currently two directories in, so all subdirs have depth 3 res += [os.path.join(root, d) for d in dirs] dirs[:] = [] # Don't recurse any deeper print(res) 

Это не совсем аккуратно , но под UNIX-подобной ОС вы также можете полагаться на системный инструмент, такой как «найти», и просто выполнять его как внешнюю программу, например:

 from subprocess import call call(["find", "-maxdepth", "2", "-type", "d"]) 

Затем вы можете перенаправить вывод на некоторую строковую переменную для дальнейшей обработки.

Мне очень нравится ответ phihag. Я адаптировал его в соответствии с моими потребностями.

 import fnmatch,glob def fileNamesRetrieve( top, maxDepth, fnMask ): someFiles = [] for d in range( 1, maxDepth+1 ): maxGlob = "/".join( "*" * d ) topGlob = os.path.join( top, maxGlob ) allFiles = glob.glob( topGlob ) someFiles.extend( [ f for f in allFiles if fnmatch.fnmatch( os.path.basename( f ), fnMask ) ] ) return someFiles 

Я думаю, я мог бы также сделать его генератором с чем-то вроде этого:

 def fileNamesRetrieve( top, maxDepth, fnMask ): for d in range( 1, maxDepth+1 ): maxGlob = "/".join( "*" * d ) topGlob = os.path.join( top, maxGlob ) allFiles = glob.glob( topGlob ) if fnmatch.fnmatch( os.path.basename( f ), fnMask ): yield f 

Критика приветствуется.

  • Youtube API commentThreads.update возвращает ошибку 400 при ответе на topLevelComment
  • Python: Есть ли разница между «del a» и «del (a)»?
  • Хотя однострочный контур цикла
  • Python, Удалить список B из списка A, чтобы составить список C?
  • Каков самый чистый способ добавить каталог сторонних пакетов в начало пути Python?
  • У словарей в Python есть единственное значение в редакторе?
  • Как создать кортеж кортежей в python?
  • Как отправить электронное письмо из сценария Python, который запускается в «Google App Engine»?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.