Struktur um Eigenschaften rekursiv auf Dateipfade anzuwenden

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
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,

folgendes Problem.

Ich bekomme vom Benutzer Dateipfade und für jeden Pfad mindestenz einen "modus" (letztendlich eine Funktion die auf den Pfad und alle unterordnet Ordner angewandt werden soll).
Den Modus will ich auf den Ordner und auf alle Unterordner anwenden. Da ich aber nur einmal jeden Ordner öffnen darf kann ich sie nicht einfach so durchgehen sondern muss sie immer gebündelt
pro Verzeichnis anwenden. Dazu brauche muss ich jetzt z.B. einen Modus den er auf / loslässt auch auf /path1, /path2 etc anwenden.
Nur wie bekomme ich das hin?
Versuche hier schon den ganzen Tag herum aber ich hab keine Ahnung wie man dies elegant lösen kann.
Hat jemand einen Tipp wie ich das ganze anfangen muss?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Das sieht nach einem Einsatz für os.walk aus.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,

os.walk kann ich nicht nehmen, ich darf ja jeden Ordner nur einmal öffnen (wir haben da ne Menge dateien drin so >100000 und da dauert dann ein ls bereits 10min, das ganze liegt dann noch auf einem NFS das dich dann schonmal rauschmeißt wenn du das zu häufig machst).
Sonst wäre das ganze ja trivial ^^
Oder wie meinst du das?
Hatte bereits verucht bei meinem einen durchlauf mit os.walk alles korrekt wegzuspeichern aber da wird es dann schnell sehr eklig.
BlackJack

@p90: Was verstehst Du denn unter „Ordner öffnen”? `os.walk()` ruft für jeden Ordner in der Hierarchie nur einmal `os.listdir()` auf. Weniger geht ganz offensichtlich nicht, wenn man alle Ordner verarbeiten möchte.

Wenn die Dat(ei)en so ungünstig organisiert beziehungsweise eingebunden sind, dann sollte man *das* vielleicht ändern.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

@BlackJack
Leider kann ich dies nicht ändern, ist historisch so und ich muss damit arbeiten (ja ich weiß das das Schwachsinn ist aber ist halt vorgabe)

Vlt habe ich auch /me falsch verstanden.
Für mich klang es so, als würde ich für jedes Verzeichnis einmal os.walk aufrufen, bekomme dann die Unterordner und mache dies nochmals für die Unterordner.
Damit könnte ich es machen, dauert halt nur Stunden.

Was ich bisher habe sieht so aus:
Ich rufe einmal os.walk auf und speichere mir für jeden Pfad alle Dateien weg. Die brauche ich eh in meinem Programm und drum herum komme ich nun nicht.
Die Dateien sind für mein Problem hier gerade uninteressant aber ich habe ja zumindest die Pfade.
Leider nur als Liste von Strings und muss nun irgendwie jedem Pfad seine Moden zuordnen.
Sieht dann so aus:

Code: Alles auswählen

       
walkrootmods = dict()
walkrootmods[Bsppfad] = set(Bspmodes)

realrootmods = dict()
for path1 in walkrootmods:
    if not path1 in realrootmods:
        realrootmods[path1] = set()
    for path2 in walkrootmods:
        if path1.startswith(path2):
            realrootmods[path1].update(walkrootmods[path2])

Bin mir noch nicht ganz sicher ob es tut wie es soll und ist zusätzlich noch eklig
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dein Code sagt relativ wenig aus, da rundherum noch Informationen fehlen. Die Verzeichnisse kannst du ja einfach so durchlaufen:

Code: Alles auswählen

from __future__ import print_function, unicode_literals
import os

elements = os.walk('C:\\projects\\')
for element in elements:
    print(element[0])
Wenn ich dein Problem richtig interpretiert habe solltest du an der Stelle, wo jetzt das print steht, deine Zuordnung machen können.
Antworten