Python 3.5+:
import pathlib
pathlib.Path('/my/directory').mkdir(parents=True, exist_ok=True)
pathlib.Path.mkdir
wie oben verwendet, erstellt das Verzeichnis rekursiv und löst keine Ausnahme aus, wenn das Verzeichnis bereits existiert. Wenn Sie nicht wollen oder brauchen, dass die Eltern erstellt werden, überspringen Sie die parents
Argument.
Python 3.2+:
Verwendung von pathlib
:
Wenn Sie können, installieren Sie die aktuelle pathlib
Rückport genannt pathlib2
. Installieren Sie nicht den älteren, nicht gewarteten Backport namens pathlib
. Lesen Sie dann den Abschnitt über Python 3.5+ und verwenden Sie ihn genauso.
Wenn Sie Python 3.4 verwenden, auch wenn es mit pathlib
Es fehlt das nützliche exist_ok
Option. Der Backport soll eine neuere und bessere Implementierung von mkdir
die diese fehlende Option enthält.
Verwendung von os
:
import os
os.makedirs(path, exist_ok=True)
os.makedirs
wie oben verwendet, erstellt das Verzeichnis rekursiv und löst keine Ausnahme aus, wenn das Verzeichnis bereits existiert. Es hat die optionale exist_ok
nur bei Verwendung von Python 3.2+, mit einem Standardwert von False
. Dieses Argument gibt es in Python 2.x bis 2.7 nicht. Daher besteht keine Notwendigkeit für eine manuelle Ausnahmebehandlung wie bei Python 2.7.
Python 2.7+:
Verwendung von pathlib
:
Wenn Sie können, installieren Sie die aktuelle pathlib
Rückport genannt pathlib2
. Installieren Sie nicht den älteren, nicht gewarteten Backport namens pathlib
. Lesen Sie dann den Abschnitt über Python 3.5+ und verwenden Sie ihn genauso.
Verwendung von os
:
import os
try:
os.makedirs(path)
except OSError:
if not os.path.isdir(path):
raise
Während eine naive Lösung zunächst die os.path.isdir
gefolgt von os.makedirs
Bei der obigen Lösung wird die Reihenfolge der beiden Operationen umgekehrt. Auf diese Weise wird eine häufige Wettlaufsituation verhindert, die mit einem doppelten Versuch, das Verzeichnis zu erstellen, zu tun hat, und außerdem werden Dateien von Verzeichnissen unterschieden.
Beachten Sie, dass das Erfassen der Ausnahme und die Verwendung von errno
ist von begrenztem Nutzen, weil OSError: [Errno 17] File exists
d.h. errno.EEXIST
wird sowohl für Dateien als auch für Verzeichnisse ausgelöst. Es ist zuverlässiger, einfach zu prüfen, ob das Verzeichnis existiert.
Alternativ:
mkpath
erstellt das verschachtelte Verzeichnis und tut nichts, wenn das Verzeichnis bereits existiert. Dies funktioniert sowohl in Python 2 als auch in 3.
import distutils.dir_util
distutils.dir_util.mkpath(path)
Per Fehler 10948 Eine schwerwiegende Einschränkung dieser Alternative ist, dass sie nur einmal pro Python-Prozess für einen bestimmten Pfad funktioniert. Mit anderen Worten, wenn Sie damit ein Verzeichnis erstellen, dann das Verzeichnis von innerhalb oder außerhalb von Python löschen und dann mkpath
erneut, um dasselbe Verzeichnis wiederherzustellen, mkpath
wird einfach stillschweigend seine ungültige, zwischengespeicherte Information verwenden, dass das Verzeichnis zuvor erstellt wurde, und wird das Verzeichnis nicht tatsächlich erneut erstellen. Im Gegensatz dazu, os.makedirs
stützt sich nicht auf einen solchen Cache. Diese Einschränkung kann für einige Anwendungen in Ordnung sein.
In Bezug auf das Verzeichnis der Modus Wenn Sie sich dafür interessieren, lesen Sie bitte in der Dokumentation nach.
42 Stimmen
Im Allgemeinen müssen Sie den Fall berücksichtigen, dass im Dateinamen kein Verzeichnis enthalten ist. Auf meinem Rechner ergibt dirname('foo.txt') '', das nicht existiert und makedirs() zum Scheitern bringt.
9 Stimmen
Wenn der Pfad existiert, muss man nicht nur prüfen, ob es sich um ein Verzeichnis und nicht um eine normale Datei oder ein anderes Objekt handelt (viele Antworten prüfen dies), sondern auch, ob es beschreibbar ist (ich habe keine Antwort gefunden, die dies geprüft hat)
14 Stimmen
Falls Sie hierher gekommen sind, um übergeordnete Verzeichnisse einer Dateipfadzeichenkette zu erstellen
p
Hier ist mein Codeschnipsel:os.makedirs(p[:p.rindex(os.path.sep)], exist_ok=True)