Dateinamen in Ordnern auslesen

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
TofuSalat
User
Beiträge: 7
Registriert: Montag 10. Juli 2006, 16:32

Montag 10. Juli 2006, 16:35

Hi leute,
ist vllt ne rech n00bige frage aber ich hab ka wie ich das machen soll!
Ich möchte von einem beliebigen Ordner\Verzeichnis alle dateinamen auslesen und diese in einer liste speichern. das problem ist: Wie lese ich dateinamen aus? habt ihr da irgendwie nen anhaltspunkt für mich? ich erwarte ja keine fertige lösung ;) nur bissel hilfe...
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Montag 10. Juli 2006, 17:08

mit unterordner oder ohne?
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 10. Juli 2006, 17:50


CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Montag 10. Juli 2006, 18:00

Es gibt da mehrere Ansätze, die dir vielleicht helfen könnten.

Als aller erstes benötigst du für Verzeichnis- und Dateioperationen die in Python mit ausgelieferte os Bibliothek.

Code: Alles auswählen

>>> import os
Um allgemein mit Verzeichnissen/Dateien zu arbeiten, sollte man bei Python wissen, dass man unter Windows die Backslahes verdoppeln muss da Python das '\' als erstes Elementes von Steuerungszeichen wie '\n' -> Zeilenumbruch, '\t' -> Tabulator, etc. interpretiert (Bsp: 'c;\\MyDirecotry').
Alternativ kann man auch ein "r" vor die Zeichenkette schreiben (Bsp.: r'c:\MyDirectory', wodurch Python die Umwandlung vornimmt).

Mit folgender Modul-Methode, kannst du den Inhalte eines Verzeichnisses rein 'namentlich' auflisten:

Code: Alles auswählen

>>> ziel = 'c:\\MyDirectory\\work'
>>> inhalt  = os.listdir(ziel)
>>> print inhalt
['leider', 'ohne', 'unterscheidung', 'nach.typ', 'da.es', 'nur.str', 'sind']
Du erhälst eine Liste von Zeichenketten (strings), welche du in einer Iteration mit dem jeweiligen ziel-Verzeichnis verknüpfen (os.path.join(ziel, <listen_element>)), und auf seinen Typ hin prüfen könntest.
Hierfür liefert os.path ein paar nützliche Methoden:

Code: Alles auswählen

>>> verzeichnisse = []
>>> dateien = []
>>> for elem in inhalt:
...    elem_path = os.path.join(ziel, elem)
...    if os.path.isfile(elem_path):
...        dateien.append(elem)
...    if os.path.isdir(elem_path):
...        verzeichnisse.append(elem_path)
>>> print verzeichnisse
['leider', 'ohne', 'unterscheidung', 'sind']
>>> print dateien
['nach.typ', 'da.es', 'nur.str',]
Aber Python wäre nicht Python, wenn es nicht auch weitere Möglichkeiten gäbe, gerade wenn es um die Iteration durch eine hirarisch verschachtelte Verzeichnisbaumstruktur geht:

Code: Alles auswählen

>>> for basisverzeichnis, verzeichnisse, dateien in os.walk(ziel):
...     break
>>> print basisverzeichnis
c:\MyDirectory\work
>>> print verzeichnisse
['leider', 'ohne', 'unterscheidung', 'sind']
>>> print dateien
['nach.typ', 'da.es', 'nur.str',]
Der Vorteil am os.walk() ist neben seine kürze noch dazu, dass die Methode durch alle weiteren drunter liegenden Verzeichnisebenen iteriert, und man so alle Folge-Unterverzeichnisse und Dateien "abarbeiten" kann.
Hierfür bedarf es lediglich der Entferung des "break" Statements aus der For-Schleife (und um die Erweiterung mit der eigenen, gewünschten Funktionalität).

Ideal z.B. für "Sammel-, Such-, Zähl-, Löschungs-, etc.-" Funktionalitäten.

Gruß,
>>Masaru<<
Zuletzt geändert von Masaru am Dienstag 11. Juli 2006, 09:20, insgesamt 1-mal geändert.
TofuSalat
User
Beiträge: 7
Registriert: Montag 10. Juli 2006, 16:32

Montag 10. Juli 2006, 18:11

ah danke leute ich werds mal ausprobieren!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 10. Juli 2006, 18:52

jens hat geschrieben:os.listdir()
os.walk()
Hi!

Zu dieser Liste würde ich noch glob() dazu schmeißen.

glob.glob() -- http://docs.python.org/lib/module-glob.html

Code: Alles auswählen

>>> from glob import glob
>>> glob(r"C:\_Ablage\*")
['C:\\_Ablage\\check_spool', 'C:\\_Ablage\\docutils', 
'C:\\_Ablage\\home_sw3', 'C:\\_Ablage\\home_sw3.html', 
'C:\\_Ablage\\mini_ajax', 'C:\\_Ablage\\roter_faden.txt']
>>>


lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten