os.mkdir(chemin de) renvoie OSError lorsque le répertoire n'existe pas
Je suis d'appel de l'os.mkdir pour créer un dossier avec un certain ensemble de données générées. Cependant, même si le chemin je précise n'a pas été créé, le système d'exploitation.mkdir(chemin de) soulève une OSError que le chemin existe déjà.
Par exemple, j'appelle:
os.mkdir(test)
Cet appel des résultats dans OSError: [Errno 17] File exists: 'test'
même si je n'ai pas de test répertoire ou un fichier nommé test n'importe où.
REMARQUE: le nom du chemin d'accès que j'utilise n'est pas "test", mais quelque chose de plus obscur que je suis sûr que c'est pas nommé n'importe où.
Aider s'il vous plaît?
OriginalL'auteur Quanquan Liu | 2013-09-24
Vous devez vous connecter pour publier un commentaire.
Greg réponse est bonne, mais ne va pas assez loin.
OSError
a des sous-conditions d'erreur, et vous ne voulez pas de les supprimer tous à chaque fois. Il est prudent de piège juste devrait OS erreurs.Faire des vérifications supplémentaires avant de décider de supprimer l'exception, comme ceci:
Vous ne voulez probablement pas à supprimer
errno.EACCES
(Permission denied),errno.ENOSPC
(Aucun espace disponible sur le périphérique),errno.EROFS
(Read-only file system), etc. Ou peut-être que vous voulez, mais ce doit être une décision réfléchie basée sur la logique spécifique de ce que vous êtes en train de construire.
Greg code supprime tous les OS des erreurs; c'est dangereux tout comme
except Exception
est dangereux.C'est pas "la seule bonne réponse", puisque la condition de la course n'est pas un problème dans tous (peut-être même la plupart, les cas d'utilisation.
lorsque le droit chemin est aussi facile ou plus facile que de le faire dans le mauvais sens, pour ne pas faire de la bonne façon chaque fois, c'est irresponsable. Si vous le faites de la bonne façon, à chaque fois, vous n'avez pas à perdre du temps & l'énergie de la pensée à ce sujet. Bon aux développeurs de se concentrer sur le développement de saines habitudes.
vrai, mais dans ce cas, le "facile" est discutable en termes de lisibilité. Le bon équilibre entre ces différents aspects dépend de votre cas d'utilisation. Sacrifier la lisibilité de la résistance à des conditions de course qui ne se produira jamais dans votre environnement est l'optimisation prématurée.
ce que j'ai montré est l'approche normale pour un développeur Python. Si elle n'est pas lisible, puis celui de la lecture qu'il ne comprend pas Python très bien. Sauf si vous êtes en cours d'exécution sur un seul thread OS, le potentiel de cette condition de concurrence existe toujours.
OriginalL'auteur Chris Johnson
Il suffit de vérifier si le chemin d'accès existent. si pas de créer
exists
appel et devant lamakedirs
appel. Voir ma réponse pour une solution adéquate.hehe combien de millisecondes pensez-vous qu'il y aura entre les deux états 🙂 mais oui, vous avez raison 🙂
Il va se passer juste assez souvent pour vous conduire fou en essayant de le corriger 🙂
dans a été type d'environnement dans lequel vous travaillez? et combien de processus sont-ils?
Quelqu'un de célèbre a dit une fois: Un de un sur un million de chances est mardi prochain.
OriginalL'auteur lordkain
En Python 3.2 et au-dessus, vous pouvez utiliser:
os.makedirs(path, exist_ok=True)
pour éviter de se faire une exception si le répertoire existe déjà. Cela va lever une exception si
path
existe et n'est pas un répertoire.exist_ok=True
dansmakedirs
serait encore augmenterFileExistsError
si le chemin d'accès cible existe et il n'est pas un répertoire (fichier, périphérique bloc, ...) 🙁C'est un bon point, ce n'est pas une baisse-dans le remplacement pour la capture de
FileExistsError
, bien souvent, vous ne voulez pas une exception lorsque vous essayez de créer un répertoire sur un fichier.OriginalL'auteur 1''
J'ai aussi été confronté au même problème, et surtout, lorsque la chaîne "test" contient les multiples nom de répertoire.
Ainsi, lorsque 'test' contient le répertoire unique -
Si le "test" contient plusieurs répertoire (comme '\dir1\dir2 " puis -
if
ne sert à rien.Cette
if
déclaration protège de remplacer le répertoire existant avec le même nom.Non, il n'est pas. Le système d'exploitation permettra d'éviter l'écrasement si vous vérifiez avant ou pas. Sauf si vous êtes en cours d'exécution sur un seul thread système d'exploitation, un autre processus peut créer le répertoire après le moment où vous vérifiez le répertoire n'existe pas, et le temps que vous essayez de créer. Le point de l'ensemble de la capture de l'exception est pour faire face à ce qui se passe si le répertoire existe déjà, qu'il est entré en existence la semaine dernière ou 1 microseconde ans. Le
if
ne sert à rien. Letry/except
est la seule approche fiable.OriginalL'auteur Anupam Bera
Je ne connais pas les spécificités de votre système de fichiers. Mais si vous voulez vraiment obtenir autour de cette peut-être utiliser un try/except clause?
Vous pouvez toujours faire une sorte de débogage dans l'intervalle.
OSError
exception peut se produire pour de nombreuses raisons, par exemple, des autorisations insuffisantes ou un fichier en lecture seule du système. Vous ne pouvez pas conclure que le répertoire existe déjà. Vous devez vérifier la valeur deexc.errno
pour déterminer la cause de l'exception.OriginalL'auteur Greg
Vous avez un fichier avec le nom
test
. Vous ne pouvez pas créer un répertoire avec le même nom.OriginalL'auteur CT Zhu
M'est arrivé sur Windows, c'est peut-être le cas:
Comme vous j'ai essayé de :
et a obtenu
OSError: [Errno 17] File exists: '<dirname>'
.Quand j'ai couru:
J'ai eu faux, et ça me rendait fou un peu 🙂
Le problème était le suivant: Dans une certaine fenêtre, j'étais au répertoire spécifique. Même si il n'existait pas à l'époque (je l'ai retiré linux). La solution a été pour fermer cette fenêtre \ accédez à un autre endroit.
Honteux, je sais ...
OriginalL'auteur Omer Dagan
Peut-être il y a caché le nom de dossier de test dans le répertoire.Vérifier Manuellement s'il existe.
ls -a
Créer seulement si il n'existe pas
exists
appel et devant lamakedirs
appel. Voir ma réponse pour une solution adéquate.OriginalL'auteur Tabraiz Ali