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

Freitag 11. Februar 2011, 11:53

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: 3326
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Freitag 11. Februar 2011, 12:04

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

Freitag 11. Februar 2011, 12:05

@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.

Freitag 11. Februar 2011, 12:14

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

Freitag 11. Februar 2011, 12:57

@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.

Freitag 11. Februar 2011, 13:43

@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

Freitag 11. Februar 2011, 15:08

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