Files in spezifischen Verzeichnissen nummerieren

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
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Hallo zusammen,

ich hätte eine Frage: Wie kann man Files nummereieren, welche in einem bestimmten Verzeichnis liegen?

Konkret: Im Ordner "2012" befinden sich Ordner von 01-12. In letzteren sind nochmals zwei Ordner: "d" und "e".
Wie muss ich meinen Code unten anpassen, dass:
1.) Bei der Nummerierung jeweils nur die Files von "d" betrachtet werden.
2.) Das Ganze geordnet ablaufen soll, d.h. die Reihenfolge der Files und der Ordner beachtet werden soll. (Die Files sind so gespeichert: "2012_01_01.xml", "2012_01_02.xml" usw. im Ordner "01"; "2012_02_01.xml", ... im Ordner "02" usw.)

Ich weiss, dass ich os.path halt einfach "willkürlich" durch die Verzeichnisse geht. Aber eben: Wie ist das "geordnet" möglich?

Danke für jede Hilfe! :)

Code: Alles auswählen

import os, codecs

d = {}

path = '/home/2012'

list_of_files = dict([ (file, os.sep.join((dir, file)))
                       for (dir,dirs,files) in sorted(os.walk(path))
                       for file in files
                       if file[-4:] == '.xml'])

output = dict([ (item, idx+1)
                for idx, item in enumerate(list_of_files) ])

out = codecs.open("./Out.txt", "w", "utf-8")
out.write(str(output))
BlackJack

@MarcelF6: Du musst die Namen halt selbst sortieren, denn von den Funktionen zum Auflisten wird keine Reihenfolge garantiert. Die übernehmen die Dateinamen so wie sie vom Betriebssystem/Dateisystemtreiber geliefert werden, und da gibt es keine garantierte Reihenfolge.

`walk()` würde ich hier nicht verwenden wenn die Hierarchie klar ist und die Ebenen unterschiedlich behandelt werden müssen.

Wie immer: Problem in kleinere Teilprobleme aufteilen, die getrennt lösen, und dann zu einer Gesamtlösung zusammensetzen.

Man braucht eine Funktion die alle XML-Dateien eines Verzeichnisses sortiert zurück gibt. Dann eine die alle Verzeichnisse in einem Verzeichnis sortiert zurück gibt. Dann kann man mit den beiden eine Schreiben die alle sortierten XML-Dateien in jedem ``/d/``-Unterverzeichnis aus den sortierten Verzeichnissen zurück gibt. Und das kann man dann mit `enumerate()` durchnummerieren. Die Funktion kennt übrigens auch ein zweites, optionales Argument für den Startwert.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

oder man läßt sich mit »glob.glob« eine Liste aller Dateien geben, die man einfach sortieren kann,
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Danke für eure Tipps!

Noch eine Frage: Wie kann man (z.B. beim Schreiben aller Filenames in eine Liste) nur die Verzeichnisse "[01 - 12] /d/ " durchforsten? Also man soll in den Ordner zwischen 01 und 12 immer nur die Files im Ordner "d" beachten. ("d" ist in jedem Ordner vorhanden).
Danke für die Hilfe! :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du könntest die Pfade generieren und dann für jeden Pfad einfach ``os.listdir`` aufrufen. Alternativ kannst Du auch mittels ``walk`` durch alle Verzeichnisse durchgehen und testen, ob der aktuelle Pfad dem Muster entspricht (evtl. mit ``fnmatch``). Das ist je nach Komplexität der Verzeichnisse natürlich weniger performant. Als letztes fiele mir noch ``glob`` ein, mit dem Du iirc auch bei Pfaden Wildcards nutzen kannst.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Ich habs nun so gemacht, dass ich chars und Zahlen ordne. So kommen (weil die File-Namen ja auch mit "d", "e", usw. beginnen) die Files fast so raus, wie ich es wollte. Nun füge ich einfach noch ein "if-Statement" hinzu, um zu schauen, dass ich wirklich nur die "d"-Files nehme.
Danke euch allen! :)
Antworten