2012-04-11 13 views
0

Ich suche ein wenig Hilfe, um die gewünschte Ausgabe von meinem Loop zu bekommen.Unterstützung bei der Verfeinerung der Suchergebnisse von if loop?

Ich versuche eine Liste von Pfaden zu erstellen, die zu jedem Ordner mit dem Namen 'published' führen. Es funktioniert fast, aber ich würde es begrüßen, wenn jemand mir einen Weg zeigen könnte, die Schleife daran zu hindern, Verzeichnisse auszuspionieren, die Kinder von "veröffentlicht" sind.

import os 

file = open('published_directories_list.txt', 'w'); 
top = "T:\PROJECTS"; 

for root, dirs, files in os.walk(top, topdown=False): 
    for name in dirs: 
     myPath = os.path.join(root, name); 

     if 'published' in myPath: 
      print (myPath); 
      file.write(myPath + '\n'); 
     else: 
      print (myPath + ' - no published directory!'); 

file.close(); 

print('DONE!'); 
+0

Nebenbei, 'published 'in myPath' gibt auch True für' mypath = "/ sadly/unpublished" ', was möglicherweise nicht das ist, was Sie wollen. – DSM

Antwort

1

Was passiert, ist, dass os.walk iteriert über jedes Verzeichnis unter top. Also, wenn Sie eine Verzeichnisstruktur wie:

top 
    | 
    - published 
    | | 
    | - something 
    | 
    - other 

an einem gewissen Punkt in der Schleife Ihre Linie:

myPath = os.path.join(root, name) 

eine Wurzel /top/published und einen Namen something beitreten. Offensichtlich, dann, wenn Sie if "published" is in myPath überprüfen, wird es sein. Obwohl Sie sich ein Unterverzeichnis von published ansehen, sehen Sie immer noch den Namen "published" in Ihrem Pfad.

Eine einfache Möglichkeit, dieses Problem zu beheben, wäre zu überprüfen, ob myPath endet in "veröffentlicht" (mit der endswith String-Methode), anstatt zu überprüfen, ob es einfach enthält. Sie könnten Ihre if Anweisung lesen ändern:

if myPath.endswith('/published') 

Bitte beachte, dass ich am Anfang einen Schrägstrich enthalten, was wir sind zu überprüfen. Dies sollte den Punkt von DSM beheben, dass wir auch nicht "unveröffentlicht" abgleichen wollen.

0
>>> import os 
>>> folder = 'MUI' 
>>> for root, dirs, files in os.walk('C:\\windows'): 
    for dir_ in dirs: 
     if folder.lower() == dir_.lower(): 
      print os.path.join(root, folder) 
      dirs.remove(dir_) 


C:\windows\MUI 
C:\windows\AppPatch\MUI 
C:\windows\Help\MUI 
C:\windows\Help\Tours\htmlTour\MUI 
C:\windows\Help\Tours\mmTour\MUI 
C:\windows\Help\Tours\WindowsMediaPlayer\MUI 
C:\windows\Microsoft.NET\Framework\v2.0.50727\MUI 
C:\windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\MUI 
C:\windows\pchealth\MUI 
C:\windows\Resources\Themes\Luna\MUI 
C:\windows\Resources\Themes\Luna\Shell\Homestead\MUI 
C:\windows\Resources\Themes\Luna\Shell\Metallic\MUI 
C:\windows\Resources\Themes\Luna\Shell\NormalColor\MUI 
C:\windows\srchasst\MUI 
C:\windows\system32\MUI 
C:\windows\system32\oobe\MUI 
C:\windows\system32\wbem\MUI 
C:\windows\Web\MUI 

Ja, Sie dirs während Iterieren berühren kann (so werden die Kinder hier nicht durchsucht werden) !!

Ich habe Vergleiche in Kleinbuchstaben verwendet, weil Windows den Fall nicht interessiert, aber es zeigt es an. Auf Unix-ähnlichen Systemen wäre ein Vergleich wie if folder in dirs ohne die Schleife der gute Weg.