Automatisches Erstellen von Verzeichnissen mit Dateiausgabe [duplicate]
Lesezeit: 2 Minuten
Phil
Angenommen, ich möchte eine Datei erstellen:
filename = "/foo/bar/baz.txt"
with open(filename, "w") as f:
f.write("FOOBAR")
Dies gibt ein IOErrorseit /foo/bar ist nicht vorhanden.
Was ist der pythonischste Weg, um diese Verzeichnisse automatisch zu generieren? Ist es nötig mich explizit anzurufen os.path.exists und os.mkdir auf jedem einzelnen (dh /foo, dann /foo/bar)?
Krumelur
COMMUNITY-BEARBEITUNG:
Da die Frage geschlossen ist, wird die Antwort von @ David258 als Kommentar geschrieben.
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")
Ich überlasse es dem Autor dieser Antwort, dies nach eigenem Ermessen einzufügen oder zu entfernen.
Die ursprüngliche Antwort beginnt hier:
In Python 3.2+ ist das möglich elegant Mach 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")
In älteren Pythons gibt es einen weniger eleganten Weg:
Das os.makedirs Funktion tut dies. Versuche Folgendes:
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, die hinzuzufügen try-except Block soll den Fall handhaben, wenn das Verzeichnis zwischen dem erstellt wurde os.path.exists und die os.makedirs Anrufe, um uns vor Rennbedingungen zu schützen.
Musste nur vorbeischauen os.mkdir und lesen Sie die Dokumentation zu einer weiteren Funktion 🙂
– Mgilson
20. September 2012 um 17:09 Uhr
Hier gibt es einen etwas anderen Ansatz: stackoverflow.com/a/14364249/1317713 Gedanken?
– Leonid
11. April 2016 um 6:02 Uhr
Ist die Initiale if not os.path.exists benötigt seit dem os.makedirs Verwendet EAFP?