2013-07-22 4 views
1

Я пишу простую функцию, которая просматривает дерево каталогов, ища папки определенного имени. То, что мне нужно, является родительским путем. Например, для «C:/a/b/c/MATCH» я хочу «C:/a/b/c». Мне не нужны дубликаты родителей или пути к совпадениям в подпапках, поэтому, если есть «C:/a/b/c/d/e/f/MATCH», мне это не нужно. Итак, во время моей прогулки, когда у меня есть родитель, я хочу перебрать следующий текущий корень.Как остановить перемещение текущего корня и повторить его до следующего

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

def FindProjectSubfolders(masterPath, projectSubfolders): 
    for currRoot, dirnames, filenames in os.walk(masterPath): 
     # check if have a project subfolder 
     foundMatch = False 
     for dirname in dirnames: 
      for projectSubfolder in projectSubfolders: 
       if (dirname == projectSubfolder): 
        foundMatch = True; 
        break 
     if (foundMatch == True): 
      # what goes here to stop traversing "currRoot" 
      # and iterate to the next one? 

ответ

2

Обрезка dirnames пустой список, чтобы предотвратить дальнейшее перемещение по директориям ниже текущей:

def FindProjectSubfolders(masterPath, projectSubfolders): 
    for currRoot, dirnames, filenames in os.walk(masterPath): 
     # check if have a project subfolder 
     foundMatch = False 
     for dirname in dirnames: 
      for projectSubfolder in projectSubfolders: 
       if (dirname == projectSubfolder): 
        foundMatch = True; 
        break 
     if (foundMatch == True): 
      # what goes here to stop traversing "currRoot" 
      # and iterate to the next one? 
      dirnames[:] = [] # replace all indices in `dirnames` with the empty list 

Обратите внимание, что приведенный выше код изменяет список dirnames относится к с назначением среза, он делает не rebind dirnames в новый список.