Список каталогов с заданной глубиной в 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 

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

  • Проверьте, запущен ли процесс в Python (в Linux / Unix)
  • Невозможно объединить объекты 'str' и 'list'
  • Почему именование файла «con.txt» в Windows заставляет Python писать на консоль, а не на файл?
  • Почему dict имеет худший случай O (n) для стольких операций?
  • Как получить все локальные переменные другого модуля?
  • правильный способ добавления пользовательской (глубокой) логики копирования в класс python
  • PermanentTaskFailure: объект 'module' не имеет атрибута 'Migrate'
  • Можно ли использовать функции перед объявлением своего тела в python?
  • Python перемещает файлы и каталоги из одной папки в другую
  • Есть ли чистый способ подавить предупреждения компилятора от Cython при использовании pyximport.install?
  • В Python переменные внутри if условий скрывают глобальную область видимости, даже если они не выполняются?
  • Python - лучший язык программирования в мире.