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?
Struktur um Eigenschaften rekursiv auf Dateipfade anzuwenden
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.
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.
@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.
Wenn die Dat(ei)en so ungünstig organisiert beziehungsweise eingebunden sind, dann sollte man *das* vielleicht ändern.
@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:
Bin mir noch nicht ganz sicher ob es tut wie es soll und ist zusätzlich noch eklig
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
Dein Code sagt relativ wenig aus, da rundherum noch Informationen fehlen. Die Verzeichnisse kannst du ja einfach so durchlaufen:
Wenn ich dein Problem richtig interpretiert habe solltest du an der Stelle, wo jetzt das print steht, deine Zuordnung machen können.
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])