5491 votes

Vérifier si un répertoire existe et de le créer si nécessaire

Quelle est la façon la plus élégante pour vérifier si le répertoire d'un fichier va être écrit existe, et si pas, créez le répertoire? Voici ce que j'ai essayé:

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

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

f = file(filename)

D'une certaine manière, j'ai manqué os.path.exists (merci kanja, Blair, et Douglas). C'est ce que j'ai maintenant:

def ensure_dir(f):
    d = os.path.dirname(f)
    if not os.path.exists(d):
        os.makedirs(d)

Est-il un drapeau "open", qui fait de ce lieu automatiquement?

40 votes

En général, vous devrez tenir compte du cas où le nom du fichier ne contient pas de répertoire. Sur ma machine, dirname('foo.txt') donne '', qui n'existe pas et fait échouer makedirs().

14 votes

Dans python 2.7 os.path.mkdir n'existe pas. C'est os.mkdir .

9 votes

Si le chemin existe il faut non seulement vérifier si c'est un répertoire et non un fichier normal ou un autre objet (beaucoup de réponses vérifient cela) mais il faut aussi vérifier s'il est accessible en écriture (je n'ai pas trouvé de réponse qui vérifie cela).

31voto

sadakmed Points 399

Le moyen le plus rapide et le plus sûr de le faire : il créera s'il n'existe pas et ignorera s'il existe :

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

30voto

Devil Points 91

La meilleure façon de faire cela en python

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

27voto

Antti Haapala Points 11542

Dans Python 3.4, vous pouvez également utiliser la fonction tout nouveau pathlib module :

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 Points 2205

Pour une solution en une seule ligne, vous pouvez utiliser IPython.utils.path.ensure_dir_exists() :

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

De la documentation : Assurez-vous qu'un répertoire existe. S'il n'existe pas, essayez de le créer et protégez-vous contre une situation de course si un autre processus fait de même.

IPython est un paquet d'extension, qui ne fait pas partie de la bibliothèque standard.

26voto

euccas Points 11

Sur Python3 , os.makedirs supporte le réglage exist_ok . Le paramètre par défaut est False ce qui signifie qu'un OSError sera soulevé si le répertoire cible existe déjà. En définissant exist_ok à True , OSError (le répertoire existe) sera ignoré et le répertoire ne sera pas créé.

os.makedirs(path,exist_ok=True)

Sur Python2 , os.makedirs ne prend pas en charge le réglage exist_ok . Vous pouvez utiliser l'approche dans La réponse de heikki-toivonen :

import os
import errno

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X