Seite 1 von 1

Frage zu os.walk()

Verfasst: Mittwoch 23. Juli 2008, 16:38
von Flo668
Hallo,

ich versuche mit os.walk() Verzeichnisinhalte auszulesen.

Dazu folgender code:

Code: Alles auswählen

        for root, dirs, files in os.walk(root_dirs, topdown=True):
            logfile.write('root: ' + str(root)+ '\n')
            relroot = root[lsrc:]
            logfile.write('relroot: ' + str(relroot) +'\n')
...ich arbeite auf einem Linux System (kurz vorweg)

In root_dirs steht anfangs: /Volume/Dir/DirXY.

Ich ging davon aus, dass os.walk, so wie von mir oben angewandt, nun dem in root_dirs angegebenen Verzeichnis beginnt und alle darunterliefgenden Verzeichnisse anfasst, so lange bis nichts mehr da ist.

Leider wird diese Schleife gar nicht erst ausgeführt.

Schreibe ich an Stelle einer Pfadangabe einfach / in root_dirs, dann wird die Schleife ausgfeührt- jeder Unterordner von / wird abgeklappert, alle Unterordner dieses Unterordners usf.

Mir ist nnicht klar, wo nun der Unterschied liegen soll. Beides sind Pfadangaben, unter beiden Pfadangaben gibt es diverse Unterordner- was läuft da verkehrt?

Danke für Hinweise jeder art.

Verfasst: Mittwoch 23. Juli 2008, 16:50
von Crazed
Hey,
Ich wollte neulich auch Verzeichnisse auslesen, glaubst du nicht das os.listdir()
da vielleicht besser ist als sowas self-made? (Nicht das es zwingend schlecht wäre)

Aber ich habe dir trotzdem keine Antwort auf deine Frage geben können, sorry.

MfG,
CracKPod

Verfasst: Mittwoch 23. Juli 2008, 16:53
von Flo668
Das ist nicht self- made sondern auch Teil des os Moduls- es geht eigentlich darum, alle Unterordner und deren Unterordner zu durchsuchen, ob dort Dateien eines bestimmten Typs liegen.

Verfasst: Mittwoch 23. Juli 2008, 17:08
von shakebox
ja, walk ist ein wenig tricky zu verwenden. Zuerstmal liegt es mit Sicherheit schon mal daran dass Du innerhalb Deiner Schleife nur 'root' verwendest und gar nicht die dirs und files. Also kann der auch gar nicht weiter "runter" gehen im Baum.

hier mal ein kurzer Ausschnitt aus nem Code von mir, der immerhin was tut :) Ich bin noch ziemlicher Anfaenger, so dass das sicher kein perfekter Code ist.

Code: Alles auswählen

def findfiles(filepattern, base = '.'):
    """Find files matching a regex pattern recursively in base"""
    regex = re.compile(filepattern)
    matches = []
    for root, dirs, files in os.walk(base):
        for singlefile in files:
            if regex.match(singlefile):
                matches.append(root + '/' + singlefile)
    return matches
Ansonsten such einfach mal nach Beispielen fuer os.walk. Oder Du schaust Dir gleich das path-Modul an (eigentlich unter diesem Link hier: http://www.jorendorff.com/articles/python/path/, der ist bei mir aber grad down, ich kann es aber auch gern irgendwo hochladen), das vereinfacht den Umgang mit Verzeichnissen und deren Inhalt doch sehr. Hier mal noch ein Beispiel wo verschiedene Methoden gezeigt werden: http://simonwillison.net/2003/Jan/22/pythonPathModule/

Verfasst: Mittwoch 23. Juli 2008, 17:15
von shakebox
und hier noch der Sourcecode des path-Modules. Denke das ist ok, den Code 1:1 zu posten, nachdem seine Website grad nicht erreichbar ist. Wenn nicht, liebe Admins, bitte wieder loeschen:

http://paste.pocoo.org/show/80154/

Re: Frage zu os.walk()

Verfasst: Mittwoch 23. Juli 2008, 17:47
von lunar
Flo668 hat geschrieben:Mir ist nicht klar, wo nun der Unterschied liegen soll. Beides sind Pfadangaben, unter beiden Pfadangaben gibt es diverse Unterordner
Wie wäre es beispielsweise mit unterschiedlichen Berechtigungen?

Ein Fehler bei "os.listdir" ist nämlich die einzig mögliche Ursache für das von dir beobachtete Verhalten, nämlich das die Schleife gar nicht ausgeführt wird. Und die häufigste Ursache für einen Fehler bei "os.listdir" sind fehlende Berechtigungen und nicht-existierende Verzeichnisse. Also entweder existiert "root_dirs" bei dir nicht, oder die Berechtigungen zum Zugriff fehlen.

Testen kannst du das wie folgt:

Code: Alles auswählen

def onerror(error):
    print onerror

for root, dirs, files in os.walk(root_dirs, onerror=onerror):
    print root
Was passiert denn, wenn du so vorgehst?

Verfasst: Donnerstag 24. Juli 2008, 11:48
von Flo668
Erstmal vielen Dank fuer Deine Hilfe.

Wenn ich so vorgehe, wie von Dir beschrieben dann läuft die for root, dirs etc. in die onerror Funktion.

Als Fehler wird ausgegeben:

(Finished looking for files.)

in root_dirs sssteht definitiv etwas drin, das habe ich auch mittels logfile nachgeprüt, naemlich (wie es auch soll):

/home/admin/Volume/Fserver/080228_txk_test

Es ist allem Anschein Nach ein Rechteproblem. Führe ich das Skript aus und lasse den os.walk auf /home/admin laufen, dann klappt alles ganz prima.

NUR: Wieso hat mein User in dem betreffenden Verzeichnis alle möglichen Rechte (Dateien erstellen, lesen und verändern), mein Script (das ja von genau diesem User ausgeführt wird) eben nicht?

Verfasst: Donnerstag 24. Juli 2008, 12:22
von lunar
Poste am besten mal die Ausgabe von "ls -ld
/home/admin/Volume/Fserver/" sowie die Ausgabe von "ls -l /home/admin/Volume/Fserver/". Auch solltest du mal "os.listdir('/home/admin/Volume/Fserver/')" im interaktiven Interpreter probieren, und diese Ausgabe auch posten.

Verfasst: Donnerstag 24. Juli 2008, 12:54
von Flo668
Danke für die Hilfe.


Das Problem scheint gelöst...ich hatte einen Tippfehler in der Pfadsangabe und diesen immer wieder mittels History zum Starten des Skripts verwendet :oops:

Deshalb konnte auch nichts richtig funktionieren.