Python : vérifier qu'un répertoire existe, et en créer un le cas échéant ?

Tour d'horizon des différentes méthodes permettant de vérifier qu'un répertoire existe en Python, et d'en créer un le cas échéant.

Le langage Python fournit des méthodes permettant de gérer les fichiers dans un système avec le module os. Il est facile de créer un répertoire grâce à la fonction makedirs() mais il est nécessaire de vérifier au préalable s'il n'existe pas déjà et de résoudre les problématiques liées à une situation de compétition.

Le module os possède la méthode path.exists(). Cette méthode vérifie l'existence d'un répertoire. On peut donc avec une condition vérifier l'existence du répertoire et, si ce n'est pas le cas, le créer.

if not os.path.exists(repertoire):
 os.makedirs(repertoire)

Cette solution pose cependant des problèmes. Elle fonctionne bien si votre application est la seule à utiliser ces données. Si vous êtes dans une situation de compétition, il peut y avoir un problème si une autre application crée ce dossier dans l'intervalle de temps entre l'exécution des deux méthodes. De plus, la méthode path.exists() retourne vrai si un fichier existe avec ce nom alors que ce n'est pas un point bloquant pour créer un répertoire.

Pour éviter le problème d'une situation de compétition, la méthode la plus simple consiste à inverser les deux méthodes. Pour cela, il faut ajouter un try...except. Dans la partie except, on va chercher à capturer les erreurs de type OSError. On fera ensuite appel à la méthode isdir(). Cette méthode vérifie que le chemin spécifié existe et qu'il s'agit d'un répertoire (on évite le problème de fichier de cette manière). Si le répertoire existe, l'exception n'est pas envoyée.

try: 
 os.makedirs(repertoire)
except OSError:
 if not os.path.isdir(repertoire):
 Raise

A partir de la version 3.4, le langage Python peut gérer nativement ce cas. La fonction makedirs() accepte un deuxième paramètre, exist_ok. En fixant la valeur à true, la méthode ne renverra pas d'exception si le répertoire existe déjà.

os.makedirs(repertoire, exist_ok=True)

Python

Annonces Google