Frage zu Verzeichnissen und Dateien

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.
the-slaughter
User
Beiträge: 15
Registriert: Montag 28. August 2006, 19:46
Wohnort: München

Hallo, ich bin dabei mir derzeit Python anzueignen. Habe mir dafür auch extra ein Python Buch zugelegt. Trotz längerem Google Benutzen und Forum durchforsten habe ich leider keine passende Antwort gefunden. Da ich eine recht große Bildersammlung und Musiksammlung habe, hatte ich vor mir eine art Suchprogramm dafür zu entwickeln.

Was ich bisher herrausgefunden habe ist:

Code: Alles auswählen

import os
print os.listdir(r"/home/peter/ogg/")
Das ich damit Verzeichnisse angezeigt bekomme. Auch wie man beispielsweise die Musik wiedergeben kann habe ich gefunden. Jetzt bleit für mich praktisch nur das Problem, wie ich die Inhalte der Ordner gelistet bekomme und wie ich die Datei finde mithilfe einer Sucheingabe.

Für Tipps wäre ich echt sehr dankbar, auch wenn jemand irgendwelche Dokumentationen kennt (vorzugsweise in Deutsch gehalten) wäre es wirklich sehr nett. Bin aber schon recht lange dabei im internet zu suchen nach einer passenden Lösung.

PS: Genau das selbe habe ich übrigens schon mit der Bash verwirklicht, jedoch habe ich da keine GUI, wie man es unter Python einrichten kann.


Besten Dank,
The-Slaughter
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

schau dir mal os.path an!
das ist standardmäßig dabei!
oder auch os.walk
http://www.cs.unm.edu/~dlchao/flake/doom/
Maho
User
Beiträge: 10
Registriert: Sonntag 27. August 2006, 11:14

the-slaughter hat geschrieben:

Code: Alles auswählen

import os
print os.listdir(r"/home/peter/ogg/")
Das ich damit Verzeichnisse angezeigt bekomme. Auch wie man beispielsweise die Musik wiedergeben kann habe ich gefunden. Jetzt bleit für mich praktisch nur das Problem, wie ich die Inhalte der Ordner gelistet bekomme und wie ich die Datei finde mithilfe einer Sucheingabe.
os.listdir zeigt alle Inhalte des Zielpfades an. Sowohl Verzeichnisse, wie auch Dateien. Mit os.path.isfile oder os.file.isdir kannst du testen was ein Pfad genau ist.
the-slaughter
User
Beiträge: 15
Registriert: Montag 28. August 2006, 19:46
Wohnort: München

Maho hat geschrieben:
the-slaughter hat geschrieben:

Code: Alles auswählen

import os
print os.listdir(r"/home/peter/ogg/")
Das ich damit Verzeichnisse angezeigt bekomme. Auch wie man beispielsweise die Musik wiedergeben kann habe ich gefunden. Jetzt bleit für mich praktisch nur das Problem, wie ich die Inhalte der Ordner gelistet bekomme und wie ich die Datei finde mithilfe einer Sucheingabe.
os.listdir zeigt alle Inhalte des Zielpfades an. Sowohl Verzeichnisse, wie auch Dateien. Mit os.path.isfile oder os.file.isdir kannst du testen was ein Pfad genau ist.
Also in dem Verzeichniss ".ogg" liegen jeweils nochmal Unterordner, teilweise sogar über mehrere ebenen, es werden aber nur die Ordner der ersten Ebene angezeigt, leider keine Unterordner und dessen Dateien.

Tut mir leid wenn ich mich da ein wenig schwer tue, aber ich bin wirklich sehr bemüht python zu lernen, halte es für eine wirklich tolle Sprache!


edit:
Okay, habe jetzt hier im Forum noch folgendes gefunden:

Code: Alles auswählen

from glob import glob
print glob(r"/home/peter/ogg/*")
Ist vielleicht sogar mit abstand die beste Methode, weil so auch direkt gleich der Zielpfand mitgeliefert wird, doch wie bekomme ich die die ganzen einzelnen Dateien aufgelistet, die sich unterhalb der Ordner befindet?
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

wenn du keine ahnung von der tiefe derf ordnerstruktur hast,
bietet sich wahrscheiunlich os.walk an.
das öffnet alle unterordner, wenn du darüber iterierst (for-schleife).
das ergebnis musst du dann abspeichern (in einer liste würde sich anbieten)und dann mit re die namen durchsuchen.
(für die suchfunktion)
http://www.cs.unm.edu/~dlchao/flake/doom/
Maho
User
Beiträge: 10
Registriert: Sonntag 27. August 2006, 11:14

Ja, os.listdir zeigt nur den Inhalt der ebene des Pfades, aber nicht den Inhalt von Unterordnern. Dafür musst du den Pfad um die entsprechenden Namen ergänzen und os.listdir mit dem neuen Pfad erneut aufrufen.

Was willst du den genau machen? Alle Dateien eines bestimmten Typs auflisten, um dann daraus alle Dateien filtern die einen bestimmten String enthalten?
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

@maho:
dafür gibt es os.walk!
das nimmt dir die arbeit ab.
http://www.cs.unm.edu/~dlchao/flake/doom/
Maho
User
Beiträge: 10
Registriert: Sonntag 27. August 2006, 11:14

murph hat geschrieben:@maho:
dafür gibt es os.walk!
das nimmt dir die arbeit ab.
Oder macht sie mir, je nachdem.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

the-slaughter hat geschrieben:jedoch habe ich da keine GUI, wie man es unter Python einrichten kann.
Hi The-Slaughter!

Willkommen im Python-Forum!

Mit wxPython http://wxpython.org lassen sich interessante GUI erstellen. Siehe auch: http://www.python-forum.de/topic-6993.html

Und zum eigentlichen Thema habe ich auch noch einen Link: http://www.python-forum.de/post-40236.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
the-slaughter
User
Beiträge: 15
Registriert: Montag 28. August 2006, 19:46
Wohnort: München

@Maho:
Danke für die Antwort!. Zu der Frage was genau ich vorhabe:
Ich habe eine relativ große Musiksammlung, daher auch von diversen Interpreten mehrere Alben. Deshalb ist die Struktur so:
/home/peter/ogg/Interpret/Album/ manchmal aber auch /home/peter/ogg/Interpret/Album/CD-1/ . Das ist auch der Grund warum ich eine Suche auf mehreren Ebenen brauche. Die Songs sind immer bei mir so aufgebaut: Interpret - Song.ogg . Da meine Lieder also immer gleich aufgebaut sind, hätte ich daran gedacht, die Suche nicht über die ID3-Tags erfolgen zu lassen, sondern einfach über den Namen des Liedes.

@murph:
Hey, Danke erstmal für die Antwort, an die for Schleife hatte ich dabei noch gar nicht gedacht, werde ich gleich mal ausprobieren!


@gerold:
Ohh, habe mich etwas missverständlich ausgedrückt... wollte eigentlich sagen, das ich in der Bash ein solches Musik-Such-Programm bereits fertig habe, ich da aber keine Grafische Oberfläche habe. Deshalb habe ich mit Python angefangen, weil ich so portable Programme habe die auch mit einer GUI versehen werden können. Danke für die Links, einigen davon bin ich sogar schon über den weg gelaufen, konnte jedoch damit bisher noch nicht so viel mit anfangen, aber bei näherem hinschauen kommt es mir dann doch ein wenig logischer vor. Danke!

Okay, dann versuche ich mal das ich das irgendwie hinbekomme, wenn es dann soweit ist und es funktioniert, veröffentliche ich das natürlich auch, damit die nächsten die sowas suchen, gleich eine Lösung finden.

Bis dann
Slaughter
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

@the-slaughter: Wie schon oft erwähnt ist os.walk die Lösung:

Code: Alles auswählen

filelist = []
for root, dirs, files in os.walk('/home/peter/ogg'):
  for filename in files:
    if filename.endswith(".ogg"):
      filelist.append(os.path.join(root,filename))  
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Oder für eine alte Python Version noch os.path.walk() Was aber dumm zu benutzen ist...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

@the-slaughter:
kommen im dateinamen später auch noch "-" vor?
oder sind sie die einmalige trennung zwischen interpret und musikstück, keine andere möglichkeit?
also das entscheidet über die komplexiblität des programmes.
http://www.cs.unm.edu/~dlchao/flake/doom/
the-slaughter
User
Beiträge: 15
Registriert: Montag 28. August 2006, 19:46
Wohnort: München

murph hat geschrieben:@the-slaughter:
kommen im dateinamen später auch noch "-" vor?
oder sind sie die einmalige trennung zwischen interpret und musikstück, keine andere möglichkeit?
also das entscheidet über die komplexiblität des programmes.
Der Minus-Strich kommt zwischen Interpret und Titel, dazwischen liegt jeweils eine Leerzeile bsp ( Journey - Don't Stop Belivin.ogg )

Aber ich befürchte fast das ich mir da zu viel vorgenommen habe...
BlackJack

the-slaughter hat geschrieben:Aber ich befürchte fast das ich mir da zu viel vorgenommen habe...
Mach's einfach in kleinen Schritten. Schreib erst eine Funktion die mit `os.walk()` und `str.endswith()` eine Liste mit den Dateinamen zusammenstellt. Lösung steht hier im Forum eigentlich schon.

Dann eine Funktion die eine Liste mit Dateinamen entgegen nimmt und eine neue erstellt und zurück liefert, in der jedes Element wieder eine Liste ist und zwar mit dem Teil vor dem ersten Minuszeichen als erstem Element und dem Teil danach als zweitem Element. Dazu liest Du Dir am besten die Doku zu den Zeichenkettenmethoden `str.split()` und `str.strip()` durch.

Spiel auch mal im interaktiven Interpretierer herum um ein Gefühl dafür zu bekommen was die Methoden mit Zeichenketten anstellen.
the-slaughter
User
Beiträge: 15
Registriert: Montag 28. August 2006, 19:46
Wohnort: München

gerold hat geschrieben:
the-slaughter hat geschrieben:jedoch habe ich da keine GUI, wie man es unter Python einrichten kann.
Hi The-Slaughter!

Willkommen im Python-Forum!

Mit wxPython http://wxpython.org lassen sich interessante GUI erstellen. Siehe auch: http://www.python-forum.de/topic-6993.html

Und zum eigentlichen Thema habe ich auch noch einen Link: http://www.python-forum.de/post-40236.html

mfg
Gerold
:-)
Hi Gerold, habe den letzen Link ausprobiert, komme da aber nicht so ganz weiter. Denn wenn ich das Script ausführe (die Methode mit os.walk() ) dann werden mir nur die Ordner unter /home/peter/ogg/ angezeigt, aber nicht die Ordner der Ordner von /home/peter/ogg .
Eigentlich müssten ja nur das Ergebnis, was ich bekomme, wieder mit dem nahezu selben befehl verarbeitet werden, nur das sich das Verzeichnis etwas ändert. Oder benötigt man für os.walk nochmal einen speziellen parameter um auch an die unterordner zu gelangen? Habe mir schon im internet mehrere verschiedene Websites über die os Befehle angesehen, aber so richtig weiter kommen tue ich da nicht.
Mag sein, das ich da jetzt für dich als Profi mich ungewollt schwer tue, aber ich bin wirklich sehr an Python interressiert (werde mir wohl auch in der nächsten Zeit ein weiteres Python Buch zulegen)

Mfg
The-Slaughter


edit:
Habe nun hier folgendes Problem:

Code: Alles auswählen

import os
start='/home/peter/ogg/'
listenort='/home/peter/liste'
oberinhalt = os.listdir(start)
liste = file(listenort, "w")
liste.write(oberinhalt)
liste.close()
auf der Konsole bekomme ich daraufhin folgende Antwort:
peter@pc24:~> ./search.py
Traceback (most recent call last):
File "./search.py", line 70, in ?
liste.write(oberinhalt)
TypeError: argument 1 must be string or read-only character buffer, not list
peter@pc24:~>
Da bin ich echt am Ende, welchen Fehler habe ich denn in Zeile 70? Oberinhalt wurde ja schon definiert, liste wird auch tatsächlich angelegt, nur leider eben ohne Inhalt. Habe das selbe spielchen auch schon mit os.walk() ausprobiert, leider auch hier die selbe Fehlermeldung!

Vielen Dank
The-Slaughter
Maho
User
Beiträge: 10
Registriert: Sonntag 27. August 2006, 11:14

Du kannst keine Liste in eine Datei schreiben. Das muss ein String sein.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

the-slaughter hat geschrieben:Denn wenn ich das Script ausführe (die Methode mit os.walk() ) dann werden mir nur die Ordner unter /home/peter/ogg/ angezeigt, aber nicht die Ordner der Ordner von /home/peter/ogg.
Hi The-Slaughter!

Das funktioniert so:

Code: Alles auswählen

import os
import os.path

for root, dirs, files in os.walk(r"C:\Windows\system32"):
    for filename in files:
        filepath = os.path.join(root, filename)
        print filepath
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
the-slaughter
User
Beiträge: 15
Registriert: Montag 28. August 2006, 19:46
Wohnort: München

Hi Gerold, Vielen Vielen Dank! Funktioniert super 1A, sogar die Umlaute werden korrekt angezeigt! Wahnsinn, echt besten Dank an dich! Mit einem ähnlichen Befehl habe ich es auch schon ausprobiert (wie es hier bereits im forum stand) aber da hat mir wohl, wenn ich es so vergleiche das os.path.join gefehlt.

Besten Dank!
the-slaughter
User
Beiträge: 15
Registriert: Montag 28. August 2006, 19:46
Wohnort: München

ok, jetzt melde ich mich mal zurück. Ich habe festgestellt, dass das ganze nicht funktioniert, wenn ein Ordnername ein Minus im Namen trägt. Deshalb verwende ich nun einfach os.system . Nun funktioniert auch die Suche sowohl unter Windows als auch unter Linux, jedoch habe ich noch ein kleines Problem: Wie finde ich heraus, welcher Benutzer angemeldet ist?
ich habe heute schon versucht irgendwie das ganze mit:

Code: Alles auswählen

import os
os.path.expanduser(~)
zu erledigen doch das ganze hat mir keinen Erfolg gebracht. Obwohl in der Offiziellen Doku des so drinnen stand (außer ich habe es falsch Interpretiert)

Vielen Dank
The-Slaughter
Antworten