Frage zu Verzeichnisstruktur erstellen mit os

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
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Hallo zusammen,

ich habe mir eine Funktion geschrieben, um Text in eine .txt-Datei zu schreiben.
Zur Prüfung des Verzeichnisstrukturbaumes und der eventuellen Erstellung von
notwendigen Verzeichnisse habe ich folgenden Code geschrieben:

Code: Alles auswählen

def write_text_to_txt(self, output_file):
        try: # if all necessary directories exist
          f=open(output_file, 'w')
        except IOError: # if directory error, create path
            path=""  
            directory=re.split(r"/",output_file) #split path in folders
            for i in range(len(directory)-1): # 0 to len(directory)-1
                try: #create each part of the path, one by one
                    os.mkdir("{path}{directory}".format(path=path,directory=directory[i]))
                    path+=directory[i]
                    path+="/"
                except OSError:
                    path+=directory[i]
                    path+="/"

        f=open(output_file, 'w')
        f.write(text)
        f.close
Funktioniert sowohl unter Windows als auch unter Linux ohne Probleme.

Gibt es an dem Code Kritikpunkte?
Oder ist er zu umständlich?
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Barcellona hat geschrieben:Gibt es an dem Code Kritikpunkte?
Oder ist er zu umständlich?
Magst du os.makedirs() nicht?
BlackJack

@Barcellona: Ja da gibt es Kritikpunkte. Ich weiss gar nicht wo ich da anfangen soll. Eine Datei die geöffnet aber nicht wieder geschlossen wird, hart kodierte '/' und Zeichenkettenoperationen statt plattformunabhängige Funktionen aus `os.path`, unnötige Laufvariable für Indexzugriffe, erweitern von Zeichenketten mit ``+=`` in einer Schleife. Am besten wegwerfen und neu schreiben. Mit `os.path`-Funktionen und `os.makedirs()` statt das selber nochmal zu erfinden.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Außerdem heißt IOError nicht automatisch, dass es den Pfad nicht gibt (oder?).
Dann bliebe so etwas:

Code: Alles auswählen

def dump_text(text, fname):
    while True:
        try:
            with open(fname, "w") as dump_file:
                dump_file.write(text)
        except IOError as exc: # new syntax (>= python2.6)
        # old syntax: "except IOError, exc:"
            if exc.errno == errno.ENOENT: # file/path does not exist
                os.makedirs(os.path.dirname(fname)) # create missing directories
            else:
                raise # Don't handle e.g. permission issues here
        else:
            break
Python kennt kein "do ... while", aber ein "try..except...else", deshalb die 'Endlos'-Schleife

ps.:
@BLackJack: Zu deiner .sig fällt mir immer nur " 'Up Scotty' is the last place I want to be beamed" ein ;)
BlackJack

@b.esser-wisser: Ich hätte es etwas ineffizienter, aber dafür wohl auch unkomplizierter ausgedrückt und immer erst versucht den Pfad anzulegen (ungetestet):

Code: Alles auswählen

def dump_text(text, filename):
    try:
        os.makedirs(os.path.dirname(filename))
    except IOError, error:
        # 
        # It is no error here if the path already exists.
        # Every other reason must be re raised.
        # 
        if error.errno != errno.EEXIST:
            raise

    with open(filename, 'w') as out_file:
        out_file.write(text)
LOL! 'Up Scotty' ist auch gut. :-D
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@BlackJack: Ja, kürzer ist da vielleicht nicht schlecht.
(Praktisch würde ich das gar nicht machen: entweder hat 'mein' Programm die Kontrolle über die Struktur, dann werden alle Ordner explizit angelegt, oder der Benutzer hat die Ordner selbst zu erstellen)
Barcellona
User
Beiträge: 74
Registriert: Dienstag 25. Mai 2010, 12:10

Vielen Dank für die Hinweise, sieht jetzt gut aus :D
Antworten