Python Walker, который не идет в определенные папки

Это мой первый пост, так что будьте нежнее.;)

ПРОБЛЕМА. Я хотел бы иметь возможность использовать os.walk как средство просмотра каталогов, но не использовать определенные папки. Пример:

Дерево:

\Proj1_0
    \Load001
        \lib
        \src
\Proj2_0
    \Load001
        \lib
        \src
    \Load002
        \lib
        \src

Я хочу показать проекты и загрузки, но не подкаталоги под нагрузками. Я могу сделать это, используя следующий код.

import os


for root, subFolders, files in os.walk('.'):
    # root does NOT contain 'Load'
    if root.find('Load') == -1:
        print "\nPROJECT: " + root + "\n"
        for folder in subFolders:
            print "    " + folder

Тем не менее, список - это большой список, поэтому я попытался использовать del to, но не смог заставить его работать правильно, и то же самое, используя списки, такие как (который я получил из другого поста здесь):

def my_walk(top_dir, ignore):
    for dirpath, dirnames, filenames in os.walk(top_dir):
        dirnames[:] = [
            dn for dn in dirnames
            if os.path.join(dirpath, dn) not in ignore]
        yield dirpath, dirnames, filename
list my_walk('.','Load')

Но я не мог заставить возвращение работать должным образом. Я новичок в Python и ценю любую помощь. Спасибо!

3 ответа

Решение

Вы можете попробовать следующее:

for x in os.walk('.', topdown=True):
    dirpath, dirnames, dirfiles = x
    print(dirpath, dirnames)
    dirnames[:] = filter(lambda x : not x.startswith('Load'), dirnames)

От help(os.walk)Вы можете изменить names если topdown является True, чтобы ограничить поиск.

Пытаться:

    dirnames[:] = [
        dn for dn in dirnames
        if ignore not in os.path.join(dirpath, dn)]

Вы хотите хранить каталоги, где os.path.join(dirpath, dn) не содержит строку ignore,


Кстати, вы вправе использовать dirnames[:] на левой стороне задания. Чтобы удалить каталоги, которые посетили os.walk, вы должны изменить тот же список dirnames,

dirnames[:] = ... изменяет тот же список на месте.dirnames = ... перенаправил бы имя dirnames к другому значению.

Кстати, это то, что я закончил с...

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)

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

Другие вопросы по тегам