Как пропустить каталоги в OS Walk Python 2.7

Я написал сценарий вырезания изображения, чтобы помочь с моей работой. Инструмент вырезает изображения по указанному расширению и сравнивает с хэш-базой данных.

Инструмент используется для поиска по подключенным дискам, на некоторых из которых установлены операционные системы.

Проблема, с которой я сталкиваюсь, заключается в том, что когда диск монтируется с операционной системой, он выполняет поиск в каталоге "Все пользователи" и включает в себя образы с моего локального диска.

Я не могу понять, как пропустить каталог "Все пользователи" и просто придерживаться подключенного диска.

Мой раздел для os.walk выглядит следующим образом:

for path, subdirs, files in os.walk(root):
    for name in files:
        if re.match(pattern, name.lower()):
                appendfile.write (os.path.join(path, name))
                appendfile.write ('\n')
                log(name)
                i=i+1

Любая помощь высоко ценится

1 ответ

Решение

Если предположить, All Users это имя каталога, вы можете удалить каталог из вашего subdirs список, так что os.walk() не перебирает это.

Пример -

for path, subdirs, files in os.walk(root):
    if 'All Users' in subdirs:
        subdirs.remove('All Users')
    for name in files:
        if re.match(pattern, name.lower()):
                appendfile.write (os.path.join(path, name))
                appendfile.write ('\n')
                log(name)
                i=i+1

Если вы только хотите не ходить за All Users внутри конкретного родителя, вы можете включить проверку для этого также в if состояние.

От os.walk документация -

os.walk (top, topdown = True, onerror = None, followlinks = False)

Генерируйте имена файлов в дереве каталогов, обходя дерево сверху вниз или снизу вверх. Для каждого каталога в дереве с корнем в вершине каталога (включая саму вершину) он выдает 3-кортеж (dirpath, dirnames, filenames).

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

topdown обычно верно, если не указано иное.

Если у вас есть несколько каталогов, которые вы хотите удалить, вы можете использовать назначение слайсов в oder для удаления исключенных каталогов в subdirs

excl_dirs = set(('All Users', 'some other dir'))

for path, subdirs, files in os.walk(root):
    subdirs[:] = [d for d in subdirs if d not in excl_dirs]
    ...
Другие вопросы по тегам