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

Montag 28. August 2006, 20:09

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:

Montag 28. August 2006, 20:13

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

Montag 28. August 2006, 20:29

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

Montag 28. August 2006, 20:40

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:

Montag 28. August 2006, 20:53

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

Montag 28. August 2006, 20:53

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:

Montag 28. August 2006, 20:56

@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

Montag 28. August 2006, 21:06

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:

Montag 28. August 2006, 21:13

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

Montag 28. August 2006, 21:43

@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

Dienstag 29. August 2006, 10:09

@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
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 29. August 2006, 10:39

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

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

Dienstag 29. August 2006, 20:16

@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

Mittwoch 30. August 2006, 00:17

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

Mittwoch 30. August 2006, 12:02

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