Seite 1 von 1
Datei aus Ordner und Subordner auslesen
Verfasst: Freitag 2. Mai 2014, 10:01
von novissimiora
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
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
Re: Datei aus Ordner und Subordner auslesen
Verfasst: Freitag 2. Mai 2014, 10:17
von sparrow
Rekursives durchsuchen von Ordnerbäumen funktioniert mit
os.walk().
Re: Datei aus Ordner und Subordner auslesen
Verfasst: Freitag 2. Mai 2014, 13:10
von novissimiora
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
bzw
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?
Re: Datei aus Ordner und Subordner auslesen
Verfasst: Freitag 2. Mai 2014, 13:28
von 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.
Re: Datei aus Ordner und Subordner auslesen
Verfasst: Freitag 2. Mai 2014, 13:57
von novissimiora
@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.
Re: Datei aus Ordner und Subordner auslesen
Verfasst: Freitag 2. Mai 2014, 15:56
von 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.