Seite 1 von 1

automatisiert Ordnerstruktur anlegen. Wie schlau machen?

Verfasst: Mittwoch 13. Mai 2009, 20:01
von shakebox
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

Verfasst: Mittwoch 13. Mai 2009, 21:09
von 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.

Verfasst: Mittwoch 13. Mai 2009, 21:40
von sma
Reichen da nicht ein paar Aufrufe von `os.makedirs`?

Stefan

Verfasst: Mittwoch 13. Mai 2009, 22:11
von shakebox
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.

Verfasst: Donnerstag 14. Mai 2009, 09:44
von helduel
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