automatisiert Ordnerstruktur anlegen. Wie schlau machen?

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
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

folgende Aufgabe:

brauche fuer meine Filmprojekte immer eine bestimmte Ordnerstruktur auf der Platte. Nach folgendem Schema:

Code: Alles auswählen

Projektname
|_Shot1
| |_a
| |_b
| | |_b1
| | |_b2
| |_c
|_Shot2
| |_a
| |_b
| | |_b1
| | |_b2
| |_c
|
usw.
Dabei entsteht das immer shotweise, da im Laufe eines Projektes immer mehr Shots dazukommen. Ich braeuchte also ein Skript "create_new_shot", dem ich den Projektnamen und den jeweils gewuenschten Shotnamen angebe und das Skript legt automatisch dann die Unterstruktur eines Shots an. Diese ist immer gleich, aber eben komplexer als oben skizziert. Variabel sind also nur Projekt- und Shotname.

Und nun zur Frage:
leider ist mir da mal wieder mein noch zu geringes wirkliches Verstaendnis von Python im Weg. Ich wuerde das schaffen mit vielen Zeilen os.mkdir() untereinander. Elegant und hinterher gut wart/erweiterbar ist das aber natuerlich nicht.

Gibt es denn da auch einen pythonischeren Weg? Kann man am Anfang des Scripts irgendwie vom Prinzip her aehnlich wie oben skizziert die Struktur "aufmalen" und das dann "abarbeiten"? Nimmt man dafuer Listen oder was anderes? Wie verschachtelt man das dann? Ziel waere halt dass jemand der daran was aendern soll die Struktur moeglichst einfach und deutlich vor sich sieht und nicht im eigentlichen Abarbeitungsteil rumeditieren muss. Letztendlich also wie ne Art Templatesprache fuer Ordnerstrukturen.

Oder ist es besser, die Ordnerstruktur tatsaechlich als Ordner irgendwo abzulegen und die dann einfach von nem Script immer kopieren zu lassen?

Danke fuer jegliche Ideen die mich auf dem Weg zu eleganter Programmierung statt umstaendlicher Zeile-fuer-Zeile-Abarbeitung voran bringen!

Shakebox
BlackJack

@shakebox: Man könnte es in der Art hier machen:

Code: Alles auswählen

import os


class Dir(object):
    def __init__(self, name, children=()):
        self.name = name
        self.children = children

    def make_dirs(self, path):
        path = os.path.join(path, self.name)
        os.makedirs(path)
        for child in self.children:
            child.make_dirs(path)


def main():
    project_name = 'project_foo'
    shot_name = 'shot_bar'
    tree = Dir(project_name,
               [Dir(shot_name,
                    [Dir('a'),
                     Dir('b',
                         [Dir('b1'),
                          Dir('b2')]),
                     Dir('c')])])
    tree.make_dirs('/tmp')
Ergebnis:

Code: Alles auswählen

bj@s8n:~$ tree /tmp/project_foo/
/tmp/project_foo/
`-- shot_bar
    |-- a
    |-- b
    |   |-- b1
    |   `-- b2
    `-- c

6 directories, 0 files
Keine Ahnung ob das "lesbar" genug für Laien ist.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Reichen da nicht ein paar Aufrufe von `os.makedirs`?

Stefan
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

klar reichen die. Wirklich übersichtlich sieht das dann aber halt nicht aus. Sind ja ein paar mehr Ordner als oben nur prinzipiell skizziert.

Die makedirs krieg ich schon hin. Ich will eben nur nebenbei ja auch ein wenig "Programmieren-Denken" lernen, vor allem in Bezug auf Python. Und deshalb dachte ich ich frag mal ob es da nicht nen Ansatz gibt der deutlich eleganter ist als lauter makedirs. Die Lösung von BlackJack geht ja schon in die Richtung, auch wenn es durch die vielen verschachtelten Klammern dann natürlich schnell zu Fehlern kommen kann.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,

wenn es eine sehr komplexe Struktur ist, die immer gleich ist, dann würde ich ein Skeleton-Verzeichnis erstellen, dort die Struktur anlegen und bei Bedarf den kompletten Baum kopieren.

Gruß,
Manuel
Antworten