Seite 1 von 1

Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 17:22
von jtschoch
Hi,

Ich habe mir ein Skript geschrieben was mein ganzes Dateisystem ausprinten soll.
Aber nur bestimmte Dateiendungen anzeigen lassen und das funktioniert ganz gut,
aber ich will nicht den ganzen Pfad immer haben, und meine Frage ist wei ich den
Ordnernamen und Dateinamen vom Pfad trennen kann.
EDIT: HABE GERADE BEMERKT DAS DIE DATEIENDUNGEN NICHT FUNKTIONIEREN!

Code:

Code: Alles auswählen

import os
import glob, string

pfad = "/home/jtschoch/Prog/python/"

 
for Ordner, subfolders, files in os.walk(pfad):#Hier liegt irgendwo der fehler!
    if not len(files) > 1:
        Ordner = Ordner
        print Ordner


        Ordnername = Ordner        
        print
        print "#############~" + Ordnername + "~#############"
        print Ordner
        print
        Dateien = glob.glob(Ordner + "*")
        for Dateien in Dateien:
            print Dateien

                
Die ausgabe sieht jetzt so aus:

#############~/home/jtschoch/Prog/python/Ordner~#############
/home/jtschoch/Prog/python/Ordner/

/home/jtschoch/Prog/python/Ordner/file.py

Aber so soll sie aussehen:

#############~Ordner~#############
/home/jtschoch/Prog/python/Ordner/

... file.py

.
.
.

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 17:37
von Hyperion
Schau Dir mal das `os.path`-Modul an; da findest Du geeignete Funktionen zur Manipulation von Pfaden.

Außerdem würde ich statt `glob` hier das `fnmatch`-Modul vorschlagen, da Du dank `os.walk` die Dateinemen schon hast.

Pfade setzt man niemals mit `+` zusammen!

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 17:41
von jtschoch
Ich habe schon gemerkt das das sch* ist!
Die funktion unten kann garnicht funktionieren!

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 17:43
von jtschoch
Hier schon das verbesserte:

Code: Alles auswählen

import os
import glob, string


def zeige():
    with open("Dateien.txt", "r") as o:
        Ordner=o.readlines()
        
    if Ordner in Ordner:    
        Ordnername = Ordner        
        print
        print "#############~" + Ordnername + "~#############"
        print Ordner
        print
        Dateien = glob.glob(os.path.join(Ordner, "*.py"))
        for Dateien in Dateien:
            print Dateien
    
pfad = "/home/jtschoch/Prog/python/"


for Ordner, subfolders, files in os.walk(pfad):
    f = open("Dateien.txt", "a")
    if not len(files) > 1:
        Ordner = Ordner
        f.write(Ordner)
    f.close()
            
zeige()

Wie ging das nochmal mit dem zeilenauslesen Zeile für Zeile?
Ich habe auch gekuckt bei os.path, aber nicht das richtige gefunden das ich das zumbeispiel
/home/jtschoch/Prog/python nur
pythn bekomme!

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 18:05
von problembär
Am besten, Du wirst Dir erstmal darüber klar, was Du von "os.walk()" überhaupt zurückerhältst:

Code: Alles auswählen

#!/usr/bin/python
# coding: iso-8859-1

import os

path = "/home/jtschoch/Prog/python/"

for rootdir, dirs, files in os.walk(path):
    print rootdir
    print
    print dirs
    print
    print files
Ich glaube, das "glob" brauchst Du dann gar nicht mehr, sondern kannst die Ausgabe von Hand filtern.

Dieses "#############~" verwirrt mich zum jetzigen Zeitpunkt ein bißchen. Am besten fügst Du den "Eye-candy" ganz am Schluß ein, wenn Du ihn denn haben möchtest.
Hyperion hat geschrieben:Schau Dir mal das `os.path`-Modul an; da findest Du geeignete Funktionen zur Manipulation von Pfaden.
Vor allem "os.path.basename()" und "os.path.dirname()" könnten für Deine Ausgangsfrage hilfreich sein. Allerdings zerteilt die Ausgabe von os.walk() das ja auch schon selbst.
Hyperion hat geschrieben:Pfade setzt man niemals mit `+` zusammen!
Obwohl ich sonst Strings gern mit '+' zusammensetze, finde ich auch, daß "os.path.join()" recht hilfreich ist. Sonst verheddert man sich leicht mit den vielen "/".

Willst Du große Variablennamen wie "Ordner" verwenden oder wie gefallen Dir englische, kleine Bezeichnungen wie "folder"?

Code: Alles auswählen

for Dateien in Dateien:
dürfte nicht funktionieren, da die Variablen durcheinandergeraten dürften.

Gruß

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 18:08
von jtschoch
Danke für die Hinweiße

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 18:12
von jtschoch
Sowas?

Habe ich auch angefangen zu schreiben:

Code: Alles auswählen

path = "/home/jtschoch/Prog/python"
for (path, dirs, files) in os.walk(path):

    dirs = "\n".join(dirs)
    dirs = str(dirs)
    if dirs == "[]":
        None
    else:   
        print dirs

Blos mich stören hier die Lücken,
wie bekomme ich die weg?
Und das glob wollte ich,
weil ich zumbeispiel bloß die *.py sehen will

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 18:16
von Hyperion
Liest Du Dir eigentlich irgend wie mal unsere Postings durch?

Nunjut... also...

1.) Grundsätzlich ist es sinnvoll, sich eine gute Datenstruktur zu überlegen, in welcher man Daten persistent ablegt. Das hat den Vorteil, dass das Parsen beim laden dann wesentlich leichter fällt, als wenn man stumpf irgend etwas obskures in einer Datei schreibt. In Deinem speziellen Fall bedeutet das, dass Du doch exakt das Format in die Datei schreiben solltest, welches Du als Anzeige haben willst! Du schreibst stattdessen einen Teil der Ausgabe von `os.walk` in die Datei und musst diese dann anschließend erst "parsen" und noch einmal Dateisystemzugriffe erledigen. Umständlicher und ineffizienter geht es kaum.

2.) Wenn Du einmal `with open as handler` verwendest, wieso dann nicht konsequent bei allen Dateioperationen? Am Unwissen kann das ja dann nicht liegen...

3.) Du musst Dir die Doku schon mal exakt angucken. `os.path.split` hast Du folglich übersehen, genau wie `os.path.basename` - das ist der zweite Eintrag der Funktionsliste in der Doku :!:

Und weil ich so lieb bin, hier mal ein ungetester Vorschlag:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8

import sys
import os
from fnmatch import fnmatch

def walker(path, pattern="*"):
    for root, dirs, filenames in os.walk(path):
        yield "#############~Ordner~#############"
        yield root
        for filename in filenames:
            if fnmatch(filename, pattern):
                yield filename

if __name__ == "__main__":
    print "\".join(line in walker(sys.argv[1]))
Das Speichern in eine Datei überlasse ich mal Dir.

Das Iterieren über die Zeilen einer Textdatei funktioniert einfach, indem Du über das Fileobject direkt iterierst!

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 18:28
von jtschoch
Danke für den Vorshlag isch werte mal sehen wie ich das alles verbessern kann!

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 18:33
von jtschoch
So ?

Code: Alles auswählen

import os, fnmatch

path = "/home/jtschoch/Prog/python"
for (path, dirs, files) in os.walk(path):
    
    dirs = "\n".join(dirs)
    dirs = str(dirs)
    files = "\n".join(files)
    files = str(files)
    
    print "#############~" + dirs + "~####################"
    print path + "/"
    print
    print "...\t\t"
    if fnmatch.fnmatch(files, '*.py'):
        print  files
    
    if dirs == "[]":
        None
    else:   
        print dirs
Meine Frage ist noch wie ich jetzt die lücken begbekomme.

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 18:56
von Hyperion
Das kann doch alles nicht klappen! `fnmatch` akzeptiert *einen* Dateinamen!

Und wozu einen String per `str` in einen String wandeln?

Außerdem ist die Ausgabe wohl eher nicht das, was Du haben willst.

Was für Lücken? Zeig uns doch mal eine von Dir gewollte Beispielausgabe und eine tatsächliche.

Ich würde das Ausgaben und das Generieren immer trennen!

Aber ich postete ja schon mal einen Ansatz...

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 19:54
von jtschoch
ja stimmt,
aber mit yield habe ich es noch nicht zu tun gehabt!

Auserdem funktioniert deins nicht!

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Dienstag 29. November 2011, 23:11
von problembär
jtschoch hat geschrieben:aber mit yield habe ich es noch nicht zu tun gehabt!

Auserdem funktioniert deins nicht!
Dann solltest Du vielleicht die Finger von Sachen lassen, die Du nicht verstehst und für das, was Du machen willst auch gar nicht brauchst, und Dich stattdessen darauf beschränken, das zu verstehen, was Du benutzen willst. Und das war zunächst mal die Ausgabe von "os.walk()" oder nicht?

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Mittwoch 30. November 2011, 17:48
von Hyperion
jtschoch hat geschrieben:ja stimmt,
aber mit yield habe ich es noch nicht zu tun gehabt!
Ja und? Dann lies es Dir an oder aber ersetze es. Anstelle von `yield` kannst Du die Ergebnisse ja auch in einer Liste sammeln und diese zurückgeben.
jtschoch hat geschrieben: Auserdem funktioniert deins nicht!
Ich schrieb ja schon ungetestet ;-) Aber der Fehler ist ja schnell gefunden:

Code: Alles auswählen

print "\".join(line for line in walker(sys.argv[1]))
Und antelle von "funktioniert nicht" solltest Du immer die exakte Fehlermeldung hier posten - ganz im Ernst: Das ist Dir schon 100 Mal hier gesagt worden. Vielleicht auch ein Grund, wieso sich viele andere hier mit Hilfe mittlerweile bei Postings von Dir zurück halten...

Re: Dateisystem ausprinten lassen mit os.walk und glob

Verfasst: Freitag 2. Dezember 2011, 17:59
von jtschoch
Sorry,
Vergesse ich immer!