Datei aus Ordner und Subordner 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
novissimiora
User
Beiträge: 3
Registriert: Freitag 2. Mai 2014, 09:32

Hallo ,

ich versuche automatisch Files aus mehreren Ordner einzulesen.
Wenn diese in einem Ordner sind geht das:

Code: Alles auswählen

 l = [f for f in os.listdir('path') if f.endswith('.txt')]   
In Matlab würde ich eine Struktur aus n - For Schleifen bauen (n für die Anzal der Ordnerebenen) und die Order mit "dir" auslesen. Wie kann ich dies in Python handeln, habe bisher hierzu nichts gefunden - außer den obigen Ansatz. Ich würde als Ansatz sowas nehmen

Code: Alles auswählen

 K=[I for I in    
und hier müsste irgendwie der Befehl fürs Auslesen der Ordnernamen bzw der Sprung von Order 1 bis x eingefügt werden und das ganze mit I von oben verknüpft werden. Nur wie genau das geht ist mir nicht klar.

Vielen Dank für jede Hilfe
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Rekursives durchsuchen von Ordnerbäumen funktioniert mit os.walk().
novissimiora
User
Beiträge: 3
Registriert: Freitag 2. Mai 2014, 09:32

Vielen Dank, funktioniert leider noch nicht richtig. Mit Deinem Befehl konnte ich das hier finden (http://www.pythoncentral.io/how-to-trav ... o-os-walk/ )

Code: Alles auswählen

  
 for dirName, subdirList, fileList in os.walk(rootDir):
    print('Found directory: %s' % dirName)
    for fname in fileList:
        print('\t%s' % fname)  

jetzt bin ich soweit,dass ich alle Dateien auf einmal bekomme. Was noch fehlt ist die Selektion der bestimmen Filenamen

Code: Alles auswählen

f.endswith('.jpg')   
bzw

Code: Alles auswählen

f.endswith('Name*.jpg')   
d.h der Dateiname hat die Struktur Begriff 1 Begriff2(z.B. Datum), wenn ich schreibe

Code: Alles auswählen

  
for dirName, subdirList, fileList in os.walk(rootDir):
    print('Found directory: %s' % dirName)
    if fileList == '.jpg': 
    	for fname in fileList:
        	print('\t%s' % fname)


wird nicht selektiert. Wo liegt mein Fehler?
BlackJack

@novissimiora: Der ist ziemlich offensichtlich: Du vergleichst eine Liste mit einer Zeichenkette. Das kann niemals gleich sein. Was hättest Du denn gedacht wann der ``if``-Zweig jemals ausgeführt wird? Bei welchem Wert von `fileList` wäre denn der Vergleich wahr?

Sonstige Anmerkungen: In Python werden Namen für Werte und Funktionen konventionell mit `kleinbuchstaben_und_unterstrichen` geschrieben und nicht `mixedCaseUndZusammen`. Siehe auch den Style Guide for Python Code.

Ausserdem sollte man den konkreten Datentyp nicht mit in den Namen aufnehmen. Wichtig ist was ein Wert im Programm bedeutet oder bei Container-Objekten was die Werte darin bedeuten, nicht welchen Typ ein Wert hat. Der konkrete Wert kann sich auch mal ändern, und dann muss man überall die Namen anpassen, oder hat irreführende Namen im Programm. Bei Container-Typen wie Listen verwendet man üblicherweise die Bedeutung eines einzelnen Elementes in der Mehrzahl als Name. Also beispielsweise `filenames` für eine Liste mit Dateinamen.

Falls Du nicht nur auf eine Endung testen möchtest, sondern ein ”glob-Muster”, dann kannst Du Dir mal das `fnmatch`-Modul anschauen.
novissimiora
User
Beiträge: 3
Registriert: Freitag 2. Mai 2014, 09:32

@BlackJack. Ja das stimmt, dass hätte mir auffallen müssen. Keine Chance. Wenn dann Name eines Listenelementes mit der Zeichenkette.
Ich will ja eigentlich das Resultat (also die ausgelesen Filenames) noch mal sortieren lassen. Die Frage ist, wo setze ich den Vergleich hin. Bin da gerade etwas ratlos.

ok also Begriff1_Datum? Das wäre ja schon mal gut, so sehen meine Matlab-Daten aus. Die Idee war bei den Namen, Begriff1 ist fix, Datum variabel. Ich gebe bei nur Begiriff1 vor und der Rest passt sich an. Dann muss ich mir wohl doch Gedanken machen wie ich in Latex den _ akzeptiert bekomme,aber das gehört hier nicht rein.

Ich hatte mir für meine Abfrage ja sowas gedacht: Begriff1_*.jpg (oder was für Endung auch immer). Also so einfach macht es mir dann Python nicht? Schade.
Evtl, kannst Du mir noch verraten, wo ich zumindest die Selektion rein setze

Vielen Dank und entschuldige für die Anfängerfragen.
BlackJack

@novissimiora: Du machst in der innersten Schleife ja etwas für jeden Dateinamen. Wenn das nicht für *jeden* sein soll, sondern nur für solche die eine bestimmte Bedingung erfüllen, dann muss die Prüfung der Bedingung genau dort hin.

Zum Test selber: Um Zeichenketten gegen ein Dateinamensmuster zu prüfen wie man es auch in der Shell machen könnte, also das was als „glob patterns” bezeichnet wird, gibt es wie gesagt etwas im `fnmatch`-Modul in der Standardbibliothek. Andererseits könnte man auch zwei Tests (`startswith()`/`endswith()`) mit einer logischen Und-Verknüpfung kombinieren.
Antworten