549 Stimmen

Automatisches Erstellen von Verzeichnissen mit Dateiausgabe

Angenommen, ich möchte eine Datei erstellen:

filename = "/foo/bar/baz.txt"

with open(filename, "w") as f:
    f.write("FOOBAR")

Dies gibt eine IOError da /foo/bar gibt es nicht.

Was ist der pythonischste Weg, um diese Verzeichnisse automatisch zu erzeugen? Ist es notwendig, dass ich explizit aufrufe os.path.exists y os.mkdir bei jedem einzelnen (d. h. /foo, dann /foo/bar)?

1030voto

Krumelur Punkte 28923

In Python 3.2+ können Sie unter Verwendung der vom OP angeforderten APIs Elegant tun Sie Folgendes:

import os

filename = "/foo/bar/baz.txt"
os.makedirs(os.path.dirname(filename), exist_ok=True)
with open(filename, "w") as f:
    f.write("FOOBAR")

Mit dem Pathlib-Modul (eingeführt in Python 3.4) gibt es eine alternative Syntax (danke David258):

from pathlib import Path
output_file = Path("/foo/bar/baz.txt")
output_file.parent.mkdir(exist_ok=True, parents=True)
output_file.write_text("FOOBAR")

In älterem Python gibt es einen weniger eleganten Weg:

Die os.makedirs Funktion tut dies. Versuchen Sie das Folgende:

import os
import errno

filename = "/foo/bar/baz.txt"
if not os.path.exists(os.path.dirname(filename)):
    try:
        os.makedirs(os.path.dirname(filename))
    except OSError as exc: # Guard against race condition
        if exc.errno != errno.EEXIST:
            raise

with open(filename, "w") as f:
    f.write("FOOBAR")

Der Grund für das Hinzufügen der try-except Block ist für den Fall gedacht, dass das Verzeichnis zwischen dem os.path.exists und die os.makedirs Aufrufe, um uns vor Race Conditions zu schützen.


CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X