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"?
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:
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!