Bestimmte Dateien an Funktion übergeben

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.
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Ja, ich weiß, dass es zu ähnlichen Themen schon x-Threads gab, aber ich brat mir mal ne Extrawurst...

Also ich habe eine kleine Funktion geschrieben, welche mir Messdaten zerhäckselt (=auswertet und plottet; danke nochmal an alle die mir beim Schreiben dafür geholfen haben :) );
einer der Eingabeparameter ist klugerweise der Dateiname der zu verarbeitenden Datei. Da nun die Anzahl der Dateien ins "Unermessliche" steigt (über hundert... :? ), will ich nun, dass die Funktion so oft aufgerufen wird, bis alle Dateien eines Typs (.lvm) abgearbeitet wurden.
Wie organisiere ich das mit dem Funktionsaufruf?
deets

Schau dir mal das Modul os an, und da zB os.listdir, oder os.walk, sowie das Modul glob.
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Und wie filtere ich da nach Dateiendungen?
Hier im forum habe ich den Ansatz per Suche gefunden:

Code: Alles auswählen

def verzeichnisse_einlesen():
    """Verzeichnisse des gewaehlten Verzeichnisses einlesen"""
    verzeichnisse = os.listdir('/users/***/documents/Messungen')
    return sorted(verzeichnisse)

anzeigen = verzeichnisse_einlesen()

elemente = len(anzeigen)
listen_zaehler = 0
listen_zaehler += 1

while listen_zaehler != elemente:
    listen_zaehler += 1
    anzeigen = verzeichnisse_einlesen()

print anzeigen

Der rotzt mir nur alle Dateien raus... ein wenig viel ;) Wie selektiere ich da?
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Schon mal besser ist der Ansatz hier:

Code: Alles auswählen

dirList=os.listdir('/users/***/documents/Messung')
for fname in dirList:
     print fname
Der spuckt mir pro Aufruf des Befehls print jeweils einen Dateinamen aus.
Wenn man's jetzt quik'n'dirty machen will, kann ich das print einfach durch ne if-Abfrage ersetzen, die die Dateiendung prüft und wenn sie korrekt ist die Funktion lädt...
Zuletzt geändert von Lateiner am Dienstag 4. Oktober 2011, 14:04, insgesamt 1-mal geändert.
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Ist das empfehlenswert?
deets

Schau dir nochmal genau die Doku an fuer os und os.path - vor allem zB sowas wie splitext. Oder eben das Modul glob.
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Aber auch damit ist mir, wie mir grade einfällt, nicht zu helfen...
Denn:

Code: Alles auswählen

- Messung 1
        - Datei1.lvm
        - Datei2.lvm
        - Datei3.lvm
- Messung 2
        - Datei1.lvm
        - Datei2.lvm
        - Datei3.lvm
jeweils ein Verzeichnis enthält eine Messung, die in zwei Dateien gesplittet wurden (nicht mein Fehler, aber is halt leider so) und die unbedingt zusammen geplottet werden müssten...
Nicht mehr ganz so trivial :?
BlackJack

@Lateiner: In zwei Dateien? Ich sehe da drei in jedem Verzeichnis…
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Man müsste theoretisch alle Verzeichnisse daraufhin untersuchen, ob sie lvm-Dateien enthalten und dann schließlich (da die Dateinamen immer gleich und bekannt sind) einfach durch Voreinstellung in die Funktion übergeben.

Mein erster Ansatz wäre alle Unterverzeichnisse des Verzeichnisses aufzurufen und auf das Vorhandensein der beiden Dateien zu überprüfen, diese an die Funktion zu übergeben und dann das nächste Verzeichnis aufzurufen usw...
Das is ein wenig kompliziert, findet ihr nicht? Gibt es da keinen einfacheren Weg?
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Upsala, da müssten eigentlich zwei Dateien sein, habe aber aus Versehen drei hingeschrieben. Tütet mir leid :)
deets

Nein, da gibt es keinen einfacheren Weg, weil es nunmal das ist, was das Kriterium fuer die Dateiauswahl ist.
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Gibt es da keine Python-eigene Funktion, die einem das etwas bequemer und schneller erledigt...?
deets

Jetzt wo du's sagst:

Code: Alles auswählen

from solve import my_problem

my_problem()
Mal im Ernst: das was du da beschreibst, sind 3 Zeilen Python-Code. Wenn dir das schon zu viel ist, dann solltest du ueberlegen, ob Programmieren das Richtige fuer dich ist.
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Och nö, nich schon wieder die olle kiste...
Ich programmiere eigentlich schon seit langem (andere Sprachen) und habe auch schon größere Projekte realisiert.
Dabei habe ich mir meist selbst geholfen, die Programme haben immer funktioniert, nur waren sie meist nicht performant... als ich den Quelltest mal einem gezeigt habe, der davon was verstanden hat, der schlug die Hände überm Kopf zusammen und empfahl mir, nocheinmal alles zu vergessen und neu anzufangen. Das trifft sich gut, da ich heute neue Anforderungen habe, die ich mithilfe von neuen Sprachen und Konzepten umzusetzen versuche.
Dass mir die Arbeit zu viel ist, "drei Zeilen Code" zu tippen, halte ich für etwas an der Realität vorbei... ich mache es ja de facto auch, jedoch sind die "Fremdlösungen" aufgrund von den vielen Jahren Python-Erfahrung der entsprechenden Personen meist eleganter und performanter. Sonst würde ich mich hier nicht so zum Deppen machen...
deets

Wenn du schon Programmiererfahrung hast, dann wundere ich mich, weshalb du glaubst, es gaebe etwas deutlich einfacheres als das, was Python schon bietet. Denn Aufgabe einer Programmiersprache und deren Standardbibliothek ist es nicht, alle moeglichen Spezialfaelle - und das ist deiner ja nunmal - zu antizipieren, und in eine vorgefertigte Loesung zu giessen. Das geht halt nicht.

Sonder Abstraktionen zu bieten, die einfach und maechtig sind, und mit denen man dann etwas zusammenbauen kann.

Und alle von mir genannten Bibliotheksfunktionen sind das, was man zur Loesung dieses Problems benutzt. Wenn du damit eine Loesung gestrickt hast, dann kann man die vielleicht auf einen Mangel an Eleganz hin nochmal hier vorstellen und ggf. verbessern.
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

habe ein kleines Problem mit glob.glob:
wenn ich eingebe

Code: Alles auswählen

print glob.glob('users/***/documents/python/*.py')
kommt da lediglich Komisch... habe das aus Dive into Python und da soll das eigentlich alle Python-Dateien eines Verzeichnisses zurückgeben... habe Python 2.7 64 bit Mac OS X Snow Leopard
deets

Da fehlt ein Slash am Anfang..
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Ups. Danke :)
Lateiner
User
Beiträge: 46
Registriert: Dienstag 20. September 2011, 16:56

Code: Alles auswählen

print glob.glob('/*/*.py')
Das hier funktioniert nun auch. Wie kann ich es so gestalten, dass die Verzeichnistiefe, in dem die Dateien liegen, egal sind und einfach alles durchsucht wird, bis in die letzten Ecken? :wink:
BlackJack

@Lateiner: Da würde ich nicht mehr `glob()` für verwenden, sondern `os.walk()`. Vielleicht in Verbindung mit `fnmatch.filter()`.
Antworten