Dateisystem ausprinten lassen mit os.walk und glob

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
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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

.
.
.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Ich habe schon gemerkt das das sch* ist!
Die funktion unten kann garnicht funktionieren!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
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ß
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Danke für die Hinweiße
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Danke für den Vorshlag isch werte mal sehen wie ich das alles verbessern kann!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

ja stimmt,
aber mit yield habe ich es noch nicht zu tun gehabt!

Auserdem funktioniert deins nicht!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Sorry,
Vergesse ich immer!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Antworten