To mój pierwszy post, więc bądź delikatny. ;)

Problem: Chciałbym być w stanie użyć OS.walk jako katalog Walker, ale nie do niektórych folderów. Dawny:

Drzewo:

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

Chcę pokazać projekty i ładunki, ale nie pod- katalogów pod ładunkami. Mogę to zrobić za pomocą następującego kodu.

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

Jednak lista jest jednak dużą listą, więc próbowałem użyć Del do, ale nie mogłem go uruchomić, aby pracować dobrze i to samo za pomocą list, takich jak (które dostałem z innego postu):

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')

Ale nie mogłem też poprawić powrotu do pracy. Jestem nowy w Pythonie i doceniam jakąkolwiek pomoc. Dzięki!

2
Brian B 25 wrzesień 2012, 22:04

3 odpowiedzi

Najlepsza odpowiedź

Możesz spróbować następujących rzeczy:

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

Z help(os.walk), możesz zmodyfikować names, jeśli topdown jest True, w celu ograniczenia wyszukiwania.

1
rodrigo 25 wrzesień 2012, 18:22

Próbować:

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

Chcesz zachować katalogi, gdzie os.path.join(dirpath, dn) nie zawiera łańcucha ignore.


Nawiasem mówiąc, masz prawo do użycia dirnames[:] po lewej stronie przypisania. Aby przycinać katalogi odwiedzane przez os.walk, musisz zmodyfikować tę samą listę dirnames.

dirnames[:] = ... Modyfikuje tę samą listę w miejscu. dirnames = ... przekierowałaby nazwę dirnames do innej wartości.

2
unutbu 25 wrzesień 2012, 18:25

BTW, to właśnie skończyłem z ...

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)

Wiem, że jest to stary post, ale myślałem, że powinienem zaktualizować go moją odpowiedzią. W przypadku, gdy ktoś inny jest przydatny.

0
Brian B 16 lipiec 2013, 23:30