Gibt es eine Möglichkeit, eine ähnliche Funktionalität zu erhalten wie mkdir -p
auf der Shell aus Python heraus. Ich bin auf der Suche nach einer anderen Lösung als einem Systemaufruf. Ich bin sicher, der Code ist weniger als 20 Zeilen, und ich frage mich, ob jemand es bereits geschrieben hat?
- Wie kann ich ein verschachteltes Verzeichnis sicher erstellen? (30 Antworten )
Antworten
Zu viele Anzeigen?Für Python 3.5, verwenden Sie pathlib.Path.mkdir
:
import pathlib
pathlib.Path("/tmp/path/to/desired/directory").mkdir(parents=True, exist_ok=True)
El exist_ok
Parameter wurde in Python 3.5 hinzugefügt.
Für Python 3.2, os.makedirs
hat eine optionales drittes Argument exist_ok
dass, wenn True
ermöglicht die mkdir -p
Funktionalität - es sei denn, mode
bereitgestellt wird und das vorhandene Verzeichnis andere Berechtigungen als die vorgesehenen hat; in diesem Fall, OSError
wird wie bisher erhoben:
import os
os.makedirs("/tmp/path/to/desired/directory", exist_ok=True)
Für noch ältere Versionen von Python können Sie os.makedirs
und ignorieren Sie den Fehler:
import errno
import os
def mkdir_p(path):
try:
os.makedirs(path)
except OSError as exc: # Python 2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
# possibly handle other errno cases here, otherwise finally:
else:
raise
In Python >=3.2 ist das
os.makedirs(path, exist_ok=True)
In früheren Versionen verwenden Sie @tzot's Antwort .
Dies ist einfacher als das Abfangen der Ausnahme:
import os
if not os.path.exists(...):
os.makedirs(...)
Haftungsausschluss Dieser Ansatz erfordert zwei Systemaufrufe, was in bestimmten Umgebungen/Bedingungen anfälliger für Race Conditions ist. Wenn Sie etwas Anspruchsvolleres als ein einfaches Wegwerfskript schreiben, das in einer kontrollierten Umgebung läuft, sollten Sie besser die akzeptierte Lösung wählen, die nur einen Systemaufruf erfordert.
UPDATE 2012-07-27
Ich bin versucht, diese Antwort zu löschen, aber ich denke, dass der unten stehende Kommentarthread von Nutzen ist. Daher wandle ich ihn in ein Wiki um.
Kürzlich fand ich dies distutils.dir_util.mkpath :
In [17]: from distutils.dir_util import mkpath
In [18]: mkpath('./foo/bar')
Out[18]: ['foo', 'foo/bar']
Mit Pathlib aus der Python3-Standardbibliothek:
Path(mypath).mkdir(parents=True, exist_ok=True)
Wenn parents wahr ist, werden alle fehlenden Eltern dieses Pfades als erstellt; sie werden mit den Standardberechtigungen erstellt, ohne den Modus zu berücksichtigen (in Nachahmung des POSIX-Befehls mkdir -p). Wenn exist_ok false ist (die Vorgabe), wird ein FileExistsError ausgelöst, wenn das Zielverzeichnis bereits existiert.
Wenn exist_ok true ist, werden FileExistsError-Ausnahmen ignoriert (dasselbe (gleiches Verhalten wie der POSIX-Befehl mkdir -p), aber nur, wenn die letzte Pfad Komponente keine existierende Nicht-Verzeichnis-Datei ist.
Geändert in Version 3.5: Der Parameter exist_ok wurde hinzugefügt.
- See previous answers
- Weitere Antworten anzeigen
0 Stimmen
Wie erreicht man die Entsprechung von "mkdir -p /home/Dokumente/Ordner/{Unterordner1,Unterordner2}" in os.command? Es erstellt einen Ordner als {Unterordner1,Unterordner2} anstelle von 2 verschiedenen Ordnern
0 Stimmen
Was ist der Unterschied zwischen makedirs und mkdir von os?