Frage zu os.walk()

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Flo668
User
Beiträge: 39
Registriert: Mittwoch 23. Juli 2008, 10:41

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.
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

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
Flo668
User
Beiträge: 39
Registriert: Mittwoch 23. Juli 2008, 10:41

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.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

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/
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

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/
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?
Flo668
User
Beiträge: 39
Registriert: Mittwoch 23. Juli 2008, 10:41

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?
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.
Flo668
User
Beiträge: 39
Registriert: Mittwoch 23. Juli 2008, 10:41

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.
Antworten