Ordnerstrukturen geschickt abbilden in nem Python-Script?

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

Servus!

Bin in der Filmbranche taetig und moechte gerade ein Script, das bisher als reines Bash-Shellscript vorliegt, in Python nachbauen, damit man es auch universeller einsetzen kann und es auch besser wartbar und plattformuebergreifender nutzbar ist.

Dieses Script erzeugt abhaengig von wenigen Parametern eine Ordner/Unterordner-Struktur fuer einzelne Filmshots, die nur an wenigen Stellen jeweils abweicht. Hauptunterschied ist der Name des Shotordners. Also sowas hier:

Code: Alles auswählen

Shot001
|__Folder01
|__Folder02
|  |__Subfolder01
|  |__Subfolder02
|__Folder03
In dem Shellscript wird sowas ganz einfach, aber unuebersichtlich und arg redundant geloest nach dem Motto:

Code: Alles auswählen

mkdir $shotfolder
cd $shotfolder
mkdir Folder01
mkdir Folder02
mkdir Folder02/Subfolder01
mkdir Folder02/Subfolder02
mkdir Folder03
In Python wuerde ich das ganze eigentlich nun gerne ganz oben im Script irgendwie moeglichst uebersichtlich und kompakt abbilden, damit man die Struktur sehr einfach erfassen und vor allem erweitern kann bei Bedarf. Da meine Python-Kenntnisse leider nachwievor recht rudimentaer sind, fehlt mir da immer der Ueberblick, wie man sowas in Python moeglichst elegant loest. Verwendet man da eher verschachtelte Listen oder Dictionaries oder noch andere Strukturen? Irgendwie muss ich es ja zu nem Objekt zusammenfassen, ueber das ich dann irgendwie iterieren (?) kann und so in einem Rutsch dann alle Ordner anlegen.

Danke fuer Tipps und Anstoesse in die richtige Richtung!
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

gerade gesehen, dass ich die Frage selbst schonmal gestellt habe, und zwar 2009:
viewtopic.php?f=1&t=18845

Peinlich, aber seitdem hatte sich leider nix mehr getan mit diesem Script und ich war mit ganz anderen Sachen beschaeftigt.

Von daher kann man diesen Beitrag hier auch wieder loeschen, ich darf es selbst aus irgendwelchen Gruenden nicht, obwohl noch niemand geantwortet hatte.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@shakebox: Dich stört also die Redundanz in den Subfoldern? An einer Verschachtelung über Wörterbücher oder Tuples würde mich der Schreiboverhead mehr stören:

Code: Alles auswählen

FOLDERS = [
    ('Folder01', []),
    ('Folder02', [
        ('Subfolder01', []),
        ('Subfolder02', []),
    ]),
    ('Folder03', []),
]
oder die unschöne Fallunterscheidung nach Typ:

Code: Alles auswählen

FOLDERS = [
    'Folder01',
    ('Folder02', [
        'Subfolder01',
        'Subfolder02',
    ]),
    'Folder03',
]
Alternativ kann man auch die Hierarchie durch Striche kennzeichnen:

Code: Alles auswählen

FOLDERS = [
    'Folder01',
    'Folder02',
    '-Subfolder01',
    '-Subfolder02',
    '--Subsubfolder01',
    'Folder03',
]
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Danke Sirius fuer die Gedanken. Ja, gute Frage, warum ich das eigentlich machen will. Idee war vermutlich, dass moeglichst auch mal jemand hier, der noch weniger Python kann als ich, da zur Not nen fehlenden Ordner/Unterordner hinzufuegen kann, ohne dass gleich das ganze Script nicht mehr funktioniert, weil jemand ein Komma am Zeilenende vergisst oder die Einrueckung falsch macht oder so.

Vermutlich ist das das, was man sonst durch "Template"-Loesungen loest!? Hab damit aber auch keine Erfahrung.

Vielleicht ist ne klare os.mkdir()-Struktur doch das Einfachste!?
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

shakebox hat geschrieben:... dass moeglichst auch mal jemand hier, der noch weniger Python kann als ich, da zur Not nen fehlenden Ordner/Unterordner hinzufuegen kann, ohne dass gleich das ganze Script nicht mehr funktioniert
Den Ordner anzulegen (mit os.mkdir()) ist das kleinste Problem. An das Script würde ich keinen heran lassen. Ich würde für den Anwender eine GUI vorschalten, wo er die Ordner eintragen kann. Euer Standardschema kann man vorgeben. Als Eingabemaske denke ich an eine Tabellenstruktur a la Excel / Open Office Calc. Ich würde die Tabelle so füllen (ich bediene mich mal der Excel Notation)

Code: Alles auswählen

shotfolder=a1
Folder01=b2
Folder02=b3
Subfolder01=c4
Subfolder02=c5
Folder03=b6
Im günstigsten Fall hat der Anwender lediglich den Shotfolder zu definieren. Der Ordner in dem die Struktur erzeugt wird, ist immer gleich?
BlackJack

@hans: Ich würde Anwender auch eher nicht an das Programm selbst lassen, aber eine excelartige GUI ist dann vielleicht doch ein wenig zu heftig. Eine einfache Textdatei mit der Ordnerstruktur wo die Beziehungen durch Einrückung oder wie schon vorgeschlagen durch '-'-Zeichen gekennzeichnet ist, tut es auch.

@shakebox: Man könnte auch schauen was es in dem Bereich bereits gibt. Kurze Suche hat beispielsweise das hier zutage gebracht: https://github.com/robmoggach/python-dirtt

XML und Cheetah wäre jetzt nicht so meins, ich fänd JSON oder YAML und Jinja2 sympathischer, aber vielleicht gibt es da ja auch bereits etwas.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

BlackJack hat geschrieben:einfache Textdatei mit der Ordnerstruktur wo die Beziehungen durch Einrückung oder wie schon vorgeschlagen durch '-'-Zeichen gekennzeichnet ist, tut es auch.
Auch damit sind so manche Mitarbeiter überfordert :? Aber klar, das ist natürlich wesentlich einfacher zu programmieren.
BlackJack

@hans: Das hat nichts damit zu tun wie kompliziert oder einfach die Programmierung ist, sondern wie umständlich man es für denjenigen machen möchte der das bedienen muss. Wenn Du das schon in eine GUI giessen möchtest, dann doch bitte keine *Tabelle* für eine *Baumstruktur*. Für Baumstrukturen gibt es eigene Widgets in den meisten GUI-Rahmenwerken die wesentlich besser die Struktur der Daten abbilden ohne das der Benutzer so viel falsches eingeben kann wie bei einer Tabelle wo die Mehrzahl der Zellen leer bleibt und auch leer bleiben muss.

Jemand der eine Baumstruktur in Textform mit Einrückung nicht hinbekommt, der wird auch mit einer zweidimensionalen Tabelle überfordert sein. Und in beiden Fällen möchte man solche Leute vielleicht besser keine Ordnerstrukturen definieren/erstellen lassen. :twisted:
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Statt einer verschachtelten Struktur, die die Hierarchie abbildet, könnte man auch mal überlegen, wie weit man hier mit 2er Tupeln aus einem über- und einem untergeordneten Element kommt.

Also gewissermaßen so (angelehnt an DOT/Graphviz; im Grunde ist eine Ordnerstruktur ja ein gerichteter Graph, oder?):

Code: Alles auswählen

shoot001 -> Folder01
shoot001 -> Folder02
shoot001 -> Folder03
Folder02 -> Subfolder01
Folder02 -> Subfolder02
Ob das klappt, hängt auch ein bisschen von der spezifischen Struktur ab, d.h. ob wirklich alle gleichnamigen Ordner jeweils auch dieselbe Unterstruktur haben sollen. Falls das nicht gewollt ist, wird es etwas komplizierter (dann müsste man mit IDs und Labels oder so arbeiten), was diese Variante wohl (abgesehen von der leichten Redundanz) unattraktiver macht.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Danke Euch allerseits!

Aktuell ist glaub die Idee mit '-'-Zeichen die sinnvollste in Sachen Aufwand/Nutzen-Verhaeltnis.

Es ging auch nicht drum, dass jeder User das anpassen kann, sondern auch in meiner Abwesenheit einige wenige Kollegen das evtl. bei Bedarf mal anpassen/ergaenzen koennen, ohne dass sie zuviel Ahnung von Python haben muessen.
Antworten