2012-06-12 11 views
9

Die Schleife für root, dir, Datei in os.walk(startdir) funktioniert durch diese Schritte?Verstehe ich os.walk richtig?

for root in os.walk(startdir) 
    for dir in root 
     for files in dir 
  1. get Wurzel Start dir: C: \ dir1 \ dir2 \ startdir

  2. Ordner in C erhalten: \ dir1 \ dir2 \ startdir und zurück Liste der Ordner "dirlist"

  3. Dateien im ersten Verzeichniselement abrufen und die Liste der Dateien "Dateiliste" als erstes Element einer Liste von Dateilisten zurückgeben.

  4. Verschieben Sie zum zweiten Element in dirlist und geben Sie die Liste der Dateien in diesem Ordner "filelist2" als zweites Element einer Liste mit Dateilisten zurück. usw.

  5. Umzug zum nächsten root in foldertree und ab 2. usw.

Recht? Oder bekommt es einfach alle Wurzeln zuerst, dann alle zweiten und alle dritten?

+1

, warum ich ein Minus 1 für das gekommen? habe ich etwas falsch gemacht? – Baf

Antwort

13

os.walk gibt einen Generator, der ein Tupel von Werten (current_path, Verzeichnisse in current_path, Dateien in current_path) erstellt.

Jedes Mal, wenn der Generator aufgerufen wird, folgt er jedem Verzeichnis rekursiv, bis keine weiteren Unterverzeichnisse aus dem ursprünglichen Verzeichnis verfügbar sind, in dem der Befehl walk aufgerufen wurde.

Als solche

os.walk('C:\dir1\dir2\startdir').next()[0] # returns 'C:\dir1\dir2\startdir' 
os.walk('C:\dir1\dir2\startdir').next()[1] # returns all the dirs in 'C:\dir1\dir2\startdir' 
os.walk('C:\dir1\dir2\startdir').next()[2] # returns all the files in 'C:\dir1\dir2\startdir' 

So

import os.path 
.... 
for path, directories, files in os.walk('C:\dir1\dir2\startdir'): 
    if file in files: 
      print 'found %s' % os.path.join(path, file) 

oder diese

def search_file(directory = None, file = None): 
    assert os.path.isdir(directory) 
    for cur_path, directories, files in os.walk(directory): 
     if file in files: 
      return os.path.join(directory, cur_path, file) 
    return None 

oder wenn Sie für Datei suchen möchten, können Sie dies tun:

import os 
def search_file(directory = None, file = None): 
    assert os.path.isdir(directory) 
    current_path, directories, files = os.walk(directory).next() 
    if file in files: 
     return os.path.join(directory, file) 
    elif directories == '': 
     return None 
    else: 
     for new_directory in directories: 
      result = search_file(directory = os.path.join(directory, new_directory), file = file) 
      if result: 
       return result 
     return None 
+0

Ich mag die os.path-Lösung, so dass os.path immer dem Verzeichnis entspricht, in dem sich os.walk während dieser Iteration befindet? – Baf

+0

thx auch samir! – Baf

+0

BTW alle oben genannten Antworten sind ein Antwort-Tag wert, aber ich kann nur einen der Beiträge als Antwort markieren! zu schlecht, oder gibt es eine Möglichkeit, mehrere Beiträge als Antwort zu markieren? – Baf

2

os.walk funktioniert ein bisschen anders als oben. Im Grunde gibt es Tupel von (Pfad, Verzeichnisse, Dateien) zurück. Um dies zu sehen, gehen Sie folgendermaßen vor:

import pprint 
import os 
pp=pprint.PrettyPrinter(indent=4) 
for dir_tuple in os.walk("/root"): 
    pp.pprint(dir_tuple) 

... Sie werden sehen, dass jede Iteration der Schleife einen Verzeichnisnamen gedruckt wird, eine Liste mit den Namen aller Verzeichnisse sofort in diesem Verzeichnis, und eine weitere Liste von alle Dateien in diesem Verzeichnis. os.walk wird dann jedes Verzeichnis in der Liste der Unterverzeichnisse eingeben und dasselbe tun, bis alle Unterverzeichnisse des ursprünglichen Stammverzeichnisses durchlaufen sind. Es kann helfen, etwas über Rekursion zu lernen, um zu verstehen, wie das funktioniert.

+0

Vielen Dank Alex! – Baf

+0

Ima geben Rekursion ein lesen. Also in der for-Schleife, ich tu über die Tupel-Elemente, wenn ich eine if-Anweisung für Dateien zu überprüfen, wird es nur die Anweisung überprüfen – Baf

+0

auch dieser pprint ist ziemlich nett dafür danke! – Baf

3

Hier ist ein kurzes Beispiel dafür, wie os.walk() funktioniert mit einigen Erklärungen mit ein paar os Funktionen.

Zunächst ist zu beachten, dass os.walk() kehrt drei Elemente, das Stammverzeichnis, eine Liste von Verzeichnissen (dirs) unmittelbar unterhalb der aktuellen Wurzel und eine Liste der Dateien in diesen Verzeichnissen gefunden. Die documentation wird Ihnen weitere Informationen geben.

dirs enthält eine Liste von Verzeichnissen direkt unterhalb von root, und Dateien enthalten eine Liste aller Dateien in diesen Verzeichnissen. In der nächsten Iteration übernimmt jedes Verzeichnis der in der vorherigen dirs Liste die Rolle root der Reihe nach und die Suche wird von dort fortgesetzt und nur um eine Ebene nach der aktuellen Ebene abgesucht.

Ein Codebeispiel: Damit werden die Namen von .jpg und .gif Dateien unterhalb des angegebenen Suchverzeichnisses (Ihre Wurzel) gesucht, gezählt und gedruckt. Es verwendet auch die os.path.splitext() Funktion, um die Basis der Datei von seiner Erweiterung und die os.path.join() Funktion zu trennen, um Ihnen den vollständigen Namen einschließlich Pfad der gefundenen Bilddateien zu geben.

import os 

searchdir = r'C:\your_root_dir' # your search starts in this directory (your root) 

count = 0 
for root, dirs, files in os.walk(searchdir): 
    for name in files: 
     (base, ext) = os.path.splitext(name) # split base and extension 
     if ext in ('.jpg', '.gif'):   # check the extension 
      count += 1 
      full_name = os.path.join(root, name) # create full path 
      print(full_name) 

print('\ntotal number of .jpg and .gif files found: %d' % count) 
+0

thx levon sehr gründlich! Sie Stackoverflow Jungs Rock! – Baf

+3

Nur für den Fall, dass jemand nach der Suche nach os.walk und "breath-first" darüber stolpert - die obigen Informationen sind falsch. os.walk (zumindest in Python 2.6 und 2.7) tut eine Tiefen-zuerst-Traversierung, NICHT eine Breiten-zuerst-Traversierung. Die genaue Reihenfolge, in der die Items ausgegeben werden, hängt vom topdown-Parameter ab - wenn topdown True ist (Standard), dann erfolgt eine Pre-Order-Tiefe-zuerst-Traversierung (https://en.wikipedia.org/wiki/File: Sorted_binary_tree_preorder.svg), während es, wenn es falsch ist, eine Tiefenreihenfolge nach der Reihenfolge durchführt (https://en.wikipedia.org/wiki/File:Sorted_binary_tree_postorder.svg). –

5

In einfachen Worten wird os.walk() ein Tupel von Pfad, Ordnern, Dateien im angegebenen Pfad erzeugen und die Unterordner weiter durchsuchen.

import os.path 
path=input(" enter the path\n") 
for path,subdir,files in os.walk(path): 
    for name in subdir: 
     print os.path.join(path,name) # will print path of directories 
    for name in files:  
     print os.path.join(path,name) # will print path of files 

dies erzeugt Pfade aller Unterverzeichnisse, Dateien und Dateien in Unterverzeichnissen