5668 Stimmen

Wie kann ich ein verschachteltes Verzeichnis sicher erstellen?

Wie kann man am elegantesten prüfen, ob das Verzeichnis, in das eine Datei geschrieben werden soll, existiert, und wenn nicht, das Verzeichnis mit Python erstellen? Das habe ich versucht:

import os

file_path = "/my/directory/filename.txt"
directory = os.path.dirname(file_path)

try:
    os.stat(directory)
except:
    os.mkdir(directory)

f = file(filename)

Irgendwie habe ich die os.path.exists (Danke Kanja, Blair und Douglas). Dies ist, was ich jetzt habe:

def ensure_dir(file_path):
    directory = os.path.dirname(file_path)
    if not os.path.exists(directory):
        os.makedirs(directory)

Gibt es ein Kennzeichen für open() die dafür sorgt, dass dies automatisch geschieht?

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)

33voto

simone Punkte 459

Am sichersten ist es, wenn man es auf dem schnellsten Weg macht: Es wird erstellt, wenn nicht vorhanden und übersprungen, wenn vorhanden:

from pathlib import Path
Path("path/with/childs/.../").mkdir(parents=True, exist_ok=True)

31voto

Devil Punkte 401

Der beste Weg, dies in Python zu tun

#Devil
import os
directory = "./out_dir/subdir1/subdir2"
if not os.path.exists(directory):
    os.makedirs(directory)

27voto

In Python 3.4 können Sie auch die brandneu pathlib Modul :

from pathlib import Path
path = Path("/my/directory/filename.txt")
try:
    if not path.parent.exists():
        path.parent.mkdir(parents=True)
except OSError:
    # handle error; you can also catch specific errors like
    # FileExistsError and so on.

26voto

tashuhka Punkte 4768

Für eine Einzeiler-Lösung können Sie Folgendes verwenden IPython.utils.path.ensure_dir_exists() :

from IPython.utils.path import ensure_dir_exists
ensure_dir_exists(dir)

Von der Dokumentation : Stellen Sie sicher, dass ein Verzeichnis existiert. Wenn es nicht existiert, versuchen Sie, es zu erstellen, um sich gegen eine Wettlaufsituation zu schützen, wenn ein anderer Prozess dasselbe tut.

IPython ist ein Erweiterungspaket und nicht Teil der Standardbibliothek.

26voto

euccas Punkte 707

En Python3 , os.makedirs unterstützt die Einstellung exist_ok . Die Standardeinstellung ist False was bedeutet, dass ein OSError wird ausgelöst, wenn das Zielverzeichnis bereits existiert. Durch die Einstellung exist_ok a True , OSError (Verzeichnis existiert) wird ignoriert und das Verzeichnis wird nicht erstellt.

os.makedirs(path,exist_ok=True)

En Python2 , os.makedirs unterstützt nicht die Einstellung exist_ok . Sie können den Ansatz in heikki-toivonen's Antwort :

import os
import errno

def make_sure_path_exists(path):
    try:
        os.makedirs(path)
    except OSError as exception:
        if exception.errno != errno.EEXIST:
            raise

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