искать расположение каталогов с помощью os.walk (и не проверять другие каталоги на том же уровне)

Я собираюсь получить все имена файлов и местоположения в конкретном подкаталоге (если это соответствует шаблону). Эти подкаталоги расположены в разных местах с разной глубиной (как обсуждалось: как получить все файлы из нескольких папок с одинаковыми именами).

Моя проблема: как можно скорее я нахожу «xyz» в каталоге, я не хочу проверять, является ли «xyz» подкаталогом для любых других каталогов на том же уровне (например, я не хочу проверять, если « D:/qwer/lkj может содержать xyz.

D:/qwer/xyz
D:/qwerty/qwertyui/xyz
D:/qwerty/zxc/zxc1/zxcv12/zx/xyz

Код:

for dirpath, dirnames, filenames in os.walk(path_to_main_search = 'D:\\'):
    if 'xyz' in dirpath:
      filenames = [fn for fn in filenames if fnmatch.fnmatch(fn, pattern)]

person cat_on_the_mat    schedule 22.01.2019    source источник
comment
Вы хотите проверить D:/qwerty/qwertyui/xyz на наличие других вещей после нахождения D:/qwer/xyz ?   -  person Patrick Artner    schedule 22.01.2019
comment
да, я хочу продолжить поиск в D:/qwerty/ . Например, даже если есть /qwerty/qwertyui2 и /qwerty/qwertyui3, мне тоже нужно туда зайти. Если «xyz» находится в /qwerty/qwertyui2, я тоже хочу его найти, но мне не нужно переходить в D:/qwerty/qwertyui/new/xyz   -  person cat_on_the_mat    schedule 22.01.2019


Ответы (1)


Вы можете удалить все имена каталогов, кроме 'xyz', из dirnames на месте, чтобы они не пересекались:

for dirpath, dirnames, filenames in os.walk(path_to_main_search):
    if 'xyz' in dirnames:
        dirnames[:] = ['xyz']
    if os.path.basename(dirpath) == 'xyz':
        # process filenames

Выдержка из документации пользователя os.walk:

Когда topdown равно True, вызывающая сторона может изменить список dirnames на месте (возможно, используя del или назначение среза), и walk() будет рекурсивно обращаться только к подкаталогам, имена которых остаются в dirnames; это можно использовать для сокращения поиска, установления определенного порядка посещения или даже для информирования walk() о каталогах, которые вызывающая сторона создает или переименовывает, прежде чем он снова возобновит walk().

person blhsing    schedule 22.01.2019