Shellscript soll Unterverzeichnisse erstellen - Hilfe

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
pyth0ndev
User
Beiträge: 8
Registriert: Montag 28. Januar 2013, 19:13

Hallo Leute,

ich bin noch ein ganz mit Python bewandert und brauche ein wenig Hilfe. Ich habe ein kleines Shellscript geschrieben, welches Ein Hauptverzechniss (welches man selbst frei bennen kann) erstellt und darin nochmals Unterverzechnisse erstellt. Nun Möchte ich aber in diesen ebenfalls nochmals eine weitere Verzeichnisebene erstellen, jedoch will dies nicht ganz gelingen.

Code: Alles auswählen

import os

# Hauptverzeichnis bennen
majordir = input('Welchen Namen soll das Hauptverzeichnis erhalten: ')

# Hauptverzeichnis anlegen
os.makedirs(majordir)

# In erstelletes Verzeichnis wechseln
os.chdir(majordir)

folders = ["abc", "def", "ghi", "jkl"]

# Unterverzeichnisse erstellen
for folder in folders:
	os.makedirs(folder)
	
	# Verzeichnisse (siehe folders) werden erstellt, jedoch will ich in jedem Ordner von folders
	# nochmals die Unterverzeichnisse "123" und 456 erstellen
	
	# majordir
	#   +--abc
	#       +--123
	#       +--456
	#   +--def
	#       +--123
	#       +--456
	#...usw.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Warum nicht einfach:

Code: Alles auswählen

folders = ["abc/123", "abc/456", "def/123"]

# Unterverzeichnisse erstellen
for folder in folders:
   os.makedirs(folder)
Die Liste kannst du dir dann dynamisch aufbauen.
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os

folder1 = ["abc", "def", "ghi", "jkl"]
folder2 = ["123", "456"]

for record1 in folder1:
    for record2 in folder2:
        os.makedirs(record1 + '/' + record2)
Die Lösung ist nicht ideal, da sie so nur unter Linux läuft. Bei Windows muss du / gegen \ tauschen.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

peddy hat geschrieben:Die Lösung ist nicht ideal, da sie so nur unter Linux läuft. Bei Windows muss du / gegen \ tauschen.
Oder man nimmt `os.sep` .. oder gleich `os.path.join`.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

peddy hat geschrieben:Die Lösung ist nicht ideal, da sie so nur unter Linux läuft. Bei Windows muss du / gegen \ tauschen.
Das ist nicht korrekt. Ich kann bei mir auch mit "forward"-slash arbeiten
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

/me hat geschrieben:Die Liste kannst du dir dann dynamisch aufbauen.
So zum Beispiel:

Code: Alles auswählen

import itertools
import os

level_1 = ["abc", "def", "ghi", "jkl"]
level_2 = ["123", "456"]
for combi in itertools.product(level_1, level_2):
    print(os.path.join(*combi))
Solltest du irgendwann noch eine dritte Ebene brauchen, dann brauchst du nur die Namen hinzufügen. Sonst ändert sich nichts.

Code: Alles auswählen

level_3 = ['Z', 'Y', 'X']
for combi in itertools.product(level_1, level_2, level_3):
Das ganze dann noch einmal etwas verdichtet führt zu folgendem Code.

Code: Alles auswählen

levels = [('abc', 'def', 'ghi', 'jkl'), ('123', '456'), ('Z', 'Y', 'X')]
for combi in itertools.product(*levels):
    print(os.path.join(*combi))
Statt des print würde man in diesem konkreten Anwendungsfall natürlich os.makedirs() verwenden.


Edit: Alternativ könnte man noch yield verwenden.

Code: Alles auswählen

def folders(levels):
    folder_pool = itertools.product(*levels)
    for entry in folder_pool:
        yield os.path.join(*entry)

for folder in folders(levels):
    print('- {}'.format(folder))
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

JonasR hat geschrieben:
peddy hat geschrieben:Die Lösung ist nicht ideal, da sie so nur unter Linux läuft. Bei Windows muss du / gegen \ tauschen.
Das ist nicht korrekt. Ich kann bei mir auch mit "forward"-slash arbeiten
Sorry, ich wollte keine Unwahrheiten verbreiten. Ich bin einfach zu wenig unter Windows unterwegs.
pyth0ndev
User
Beiträge: 8
Registriert: Montag 28. Januar 2013, 19:13

Danke für eure zahlreichen Antworten. Dann werde ich doch gleich mal mein Script modifizieren.

Zudem kann ich nur sagen, das dieses Forum für Python-Begeisterte für alles rund um Python sehr gut ist ;)
Antworten