web-dev-qa-db-fra.com

os.mkdir (path) renvoie OSError lorsque le répertoire n'existe pas

J'appelle os.mkdir pour créer un dossier avec un certain ensemble de données générées. Cependant, même si le chemin que je spécifie n'a pas été créé, os.mkdir (chemin) lève une erreur OSE indiquant que le chemin existe déjà.

Par exemple, j'appelle:

os.mkdir(test)

Cet appel aboutit à OSError: [Errno 17] File exists: 'test' même si je n'ai ni répertoire de test ni fichier nommé test.

REMARQUE: le nom de chemin réel que j'utilise n'est pas "test", mais quelque chose de plus obscur que je suis sûr de ne pas nommer nulle part.

Aidez-moi, s'il vous plaît?

19
Quanquan Liu

La réponse de Greg est correcte mais ne va pas assez loin. OSError a des conditions de sous-erreur et vous ne voulez pas toutes les supprimer. Il est prudent de ne capturer que les erreurs attendues du système d'exploitation.

Effectuez une vérification supplémentaire avant de décider de supprimer l'exception, comme ceci:

import errno
import os

try:
    os.mkdir(dirname)
except OSError as exc:
    if exc.errno != errno.EEXIST:
        raise
    pass

Vous ne voulez probablement pas supprimer errno.EACCES (autorisation refusée), errno.ENOSPC (il ne reste plus d’espace sur le périphérique), errno.EROFS décision consciente basée sur la logique spécifique de ce que vous construisez.

Le code de Greg supprime toutes les erreurs du système d'exploitation. c'est dangereux, tout comme except Exception est dangereux.

33
Chris Johnson

Il suffit de vérifier si le chemin existe. sinon le créer

if not os.path.exists(test):
        os.makedirs(test)
21
lordkain

J'ai également rencontré le même problème, spécialement lorsque la chaîne 'test' contient plusieurs noms de répertoire . Ainsi, lorsque 'test' contient un seul répertoire -

if not os.path.exists(test):
try:
    os.makedir(test)
except:
    raise OSError("Can't create destination directory (%s)!" % (test))  

Si le 'test' contient plusieurs répertoires comme '\ dir1\dir2', alors -

if not os.path.exists(test):
try:
    os.makedirs(test)
except:
    raise OSError("Can't create destination directory (%s)!" % (test))  
3
Anupam Bera

Vous avez là un fichier avec le nom test. Vous ne pouvez pas créer un répertoire avec exactement le même nom. 

1
CT Zhu

Cela m'est arrivé sous Windows, c'est peut-être le cas:

Comme toi j'essayais de:

os.mkdir(dirname)

et j'ai eu OSError: [Errno 17] File exists: '<dirname>'. Quand j'ai couru:

os.path.exists(dirname)

Je me suis trompé et ça m'a rendu fou pendant un moment :)

Le problème était: Dans une certaine fenêtre, j'étais dans le répertoire spécifique. Même s'il n'existait pas à ce moment-là (je l'ai supprimé de Linux). La solution était de fermer cette fenêtre\naviguez vers un autre endroit . Honteux, je sais ...

1
Omer Dagan

Je ne connais pas les détails de votre système de fichiers. Mais si vous voulez vraiment contourner cela, utilisez peut-être une clause try/except?

try:
    os.mkdir(test)
except OSError:
    print "test already exists"

Vous pouvez toujours faire une sorte de débogage en attendant. 

1
Greg

Peut-être y a-t-il un test de nom de dossier caché dans le répertoire.Vérifier manuellement s'il existe.

ls -a

Créer seulement s'il n'existe pas

if not os.path.exists(test):
    os.makedirs(test)
0
Tabraiz Ali