Comment puis-je vérifier si un fichier existe sans exceptions?
Comment faire pour savoir si un fichier existe ou non, sans l'aide de la déclaration?
Une lecture rapide de la os.chemin de la documentation, montre que ce résultat est obtenu dans un one-liner:
Pourquoi voudriez-vous éviter les exceptions en Python? Ils sont la idiomatiques façon de faire les choses.
os.path.isfile(FILEPATH)
, comme de nombreuses autres opérations similaires.Pourquoi voudriez-vous éviter les exceptions en Python? Ils sont la idiomatiques façon de faire les choses.
OriginalL'auteur spence91 | 2008-09-17
Vous devez vous connecter pour publier un commentaire.
Si la raison pour laquelle vous êtes la vérification de sorte que vous pouvez faire quelque chose comme
if file_exists: open_it()
, il est préférable d'utiliser untry
autour de la tentative de l'ouvrir. Vérifier puis de l'ouverture de risques que le fichier supprimé ou déplacé, ou quelque chose entre le moment où vous passez et lorsque vous essayez de l'ouvrir.Si vous n'avez pas l'intention d'ouvrir le fichier immédiatement, vous pouvez utiliser
os.chemin d'accès.isfile
si vous avez besoin d'être sûr que c'est un fichier.
De commencer avec Python 3.4, la
pathlib
module propose une approche orientée-objet (reporté àpathlib2
en Python 2.7):Pour vérifier un répertoire, n':
Pour vérifier si un
Path
objet existe indépendamment de savoir si c'est un fichier ou un répertoire, utilisezexists()
:Vous pouvez également utiliser
resolve(strict=True)
dans untry
bloc:Notez que
FileNotFoundError
a été introduit en Python 3. Si vous avez également besoin de l'appui de Python 2.7 ainsi que Python 3, vous pouvez utiliserIOError
à la place (FileNotFoundError
sous-classes) stackoverflow.com/a/21368457/1960959OriginalL'auteur rslite
Vous avez le
os.chemin d'accès.existe
fonction:Cela renvoie
True
pour les fichiers et les répertoires, mais vous pouvez à la place utiliserpour tester si c'est un fichier en particulier. Il suit les liens symboliques.
OriginalL'auteur PierreBdR
Contrairement à
isfile()
,exists()
sera de retourTrue
pour les répertoires.Donc, en fonction de si vous voulez que les fichiers simples ou aussi des répertoires, vous allez utiliser
isfile()
ouexists()
. Voici un simple REPL sortie.isfile()
etexists()
.OriginalL'auteur bortzmeyer
OriginalL'auteur Paul
Utilisation
os.chemin d'accès.isfile()
avecos.access()
:Il est également redondante. Si le fichier n'existe pas,
os.access()
retournera false.Sous linux, les fichiers peuvent exister mais pas accessible.
puisque vous
import os
, vous n'avez pas besoin deimport os.path
nouveau comme il le fait déjà partie deos
. Vous avez juste besoin d'importeros.path
si vous allez seulement utiliser les fonctions d'os.path
et pas deos
lui-même, pour importer une petite chose, mais comme vous l'utiliseros.access
etos.R_OK
, la deuxième à l'importation n'est pas nécessaire.OriginalL'auteur Yugal Jindle
OriginalL'auteur benefactual
Bien que presque tous les moyens possibles ont été répertoriées dans (au moins un) de la réponse (par exemple Python 3.4 choses spécifiques, a été ajoutée), je vais essayer de groupe tout ensemble.
Note: chaque morceau de Python de la bibliothèque standard de code que je vais les poster, appartient à la version 3.5.3.
Énoncé du problème:
Solutions possibles:
[Python 3]: os.chemin d'accès.existe(chemin) (également consulter d'autres la fonction de membres de la famille comme
os.path.isfile
,os.path.isdir
,os.path.lexists
pour des comportements légèrement différents)Tout bon, mais si la suite de l'importation de l'arbre:
os.path
- posixpath.py (ntpath.py)genericpath.py, ligne ~#20+
c'est juste un essayer /sauf bloc autour [Python 3]: os.stat(chemin d'accès, *, dir_fd=None, follow_symlinks=True). Ainsi, votre code est essayer /sauf libre, mais plus faible dans le framestack il y a (au moins) un un tel bloc. Ceci s'applique également à d'autres funcs (y compris
os.path.isfile
).1.1. [Python 3]: Chemin D'Accès.is_file()
Sous le capot, il ne exactement la même chose (pathlib.py, ligne ~#1330):
[Python 3]: Avec L'Énoncé De Contexte Gestionnaires. Soit:
Créer un:
Et de son utilisation - je vais reproduire le
os.path.isfile
comportement (à noter que c'est juste pour la démonstration, ne pas tentative pour écrire un tel code pour production):Utilisation [Python 3]: contextlib.supprimer(*les exceptions) - qui a été spécifiquement conçu pour sélectivement la suppression des exceptions
Mais, ils semblent être des wrappers sur essayer /sauf /d'autre /enfin blocs, comme [Python 3]: Le avec déclaration états:
Système de fichiers de la traversée des fonctions (et de rechercher les résultats pour l'élément correspondant(s))
[Python 3]: os.listdir(chemin='.') (ou [Python 3]: os.scandir(chemin='.') sur Python v3.5+, backport: [PyPI]: scandir)
Sous le capot, à la fois usage:
via [GitHub]: python/disponible - (master) disponible/Modules/posixmodule.c
os.listdir
(os.scandir
lorsque disponible)glob.glob
)os.listdir
Depuis ces itérer sur les dossiers, (dans la plupart des cas), ils sont inefficaces pour notre problème (il y a des exceptions, comme les non un caractère astérisque globbing - @ShadowRanger souligné), donc je ne vais pas insister sur eux. Pour ne pas mentionner que, dans certains cas, le nom de fichier de traitement peut être nécessaire.
[Python 3]: os.accès(chemin d'accès, le mode de fonctionnement, *, dir_fd=None, effective_ids=False, follow_symlinks=True) dont le comportement est proche de
os.path.exists
(en fait c'est plus large, principalement en raison de la 2ème argument)os.access("/tmp", os.F_OK)
Depuis, je travaille également dans C, j'ai utiliser cette méthode, car sous le capot, il appelle natif APIs (encore une fois, via "${PYTHON_SRC_DIR}/Modules/posixmodule.c"), mais elle ouvre également la porte d'un possible les erreurs de l'utilisateur, et c'est pas comme Pythonic comme d'autres variantes. Donc, comme @AaronHall souligne à juste titre, de ne pas l'utiliser, sauf si vous savez ce que vous faites:
Note: appel des indigènes APIs est également possible via [Python 3]: ctypes - Un étranger bibliothèque de fonctions pour Python, mais dans la plupart des cas, c'est plus compliqué.
(Gagner spécifique): Depuis vcruntime* (msvcr*) .dll les exportations d'un [MME Docs]: _access, _waccess fonction de la famille, voici un exemple:
Notes:
os.F_OK
dans l'appel, mais c'est juste pour plus de clarté (sa valeur est 0)La Lnx (Ubtu (16 x64)) de contrepartie ainsi:
Notes:
Au lieu coder en dur libc's path ("/lib/x86_64-linux-gnu/libc..6") qui peut (et probablement,) varie en fonction de l'ensemble des systèmes, Aucun (ou la chaîne vide) peut être transmis à CDLL constructeur (
ctypes.CDLL(None).access(b"/tmp", os.F_OK)
). Selon [man7]: DLOPEN(3):__declspec(dllexport)
(pourquoi sur la Terre, le régulière personne qui ferait ça?), le programme principal est chargeable mais à peu près inutilisableInstaller un module tiers avec le système de fichiers capacités
Plus probable, sera de s'appuyer sur l'une des manières ci-dessus (peut-être avec une légère personnalisations).
En est un exemple (encore une fois, Gagner spécifique) [GitHub]: mhammond/pywin32 - Python pour Windows (pywin32) Extensions, qui est un Python wrapper sur WINAPIs.
Mais, depuis c'est plus comme une solution de contournement, j'arrête ici.
Un autre (lame) solution (gainarie) est (comme j'aime l'appeler), la sysadmin approche: utiliser Python comme un wrapper pour exécuter des commandes shell
Gagner:
Nix (Lnx (Ubtu)):
Ligne de fond:
Note finale(s):
Difficile de doo dans un commentaire: en règle générale, il est préférable d'utiliser des constantes avec les fonctions qu'ils viennent avec. Qui s'applique lorsque vous travaillez avec plusieurs modules qui définissent la même constante, parce que certains pourraient ne pas être à jour, et c'est le meilleur pour les fonctions et les constantes d'être synchronisés. Lorsque vous travaillez avec des ctypes (en appelant les fonctions directement) je devrais avoir défini la constante (à partir de MSDN), ou de ne pas utiliser une constante à tous. C'est juste une ligne directrice que j'utilise, dans 99,9%, il fait probablement pas de différence (fonctionnellement).
Que de 3,6,
glob.iglob
(etglob.glob
) sont basés suros.scandir
, de sorte qu'il est paresseux maintenant; pour obtenir le premier coup dans un répertoire de 10M de fichiers, vous seulement de numériser jusqu'à ce que vous atteindre le premier coup. Et même pré-3.6, si vous utilisezglob
méthodes w/o aucun des caractères génériques, la fonction est intelligent: Il sait que vous ne pouvez avoir qu'un seul coup, donc il simplifie l'expansion à justeos.path.isdir
ouos.path.lexists
(selon que le chemin se termine dans/
).Cette deuxième partie de mon commentaire (non un caractère astérisque expansion ne fait pas itérer le dossier, et n'a jamais) ne signifie pas qu'il est parfaitement efficace solution pour le problème (plus lente que la possibilité d'appeler directement
os.path.isdir
ouos.path.lexist
puisque c'est un tas de Python niveau des appels de fonction et les opérations de la chaîne, avant de décider le plus efficace est viable, mais aucun autre appel-système d'e/S ou de travail, qui est un ordre de grandeur de la vitesse).OriginalL'auteur CristiFati
C'est le moyen le plus simple pour vérifier si un fichier existe. Juste parce que le fichier existait lors de la vérification n'a pas garantie qu'il sera là quand vous en avez besoin pour l'ouvrir.
La meilleure pratique est de rendre la fenêtre de (fichier), l'opération la plus petite possible, suivie par une bonne gestion des exceptions
OriginalL'auteur un33k
Python 3.4+ a orienté objet module path: pathlib. L'utilisation de ce nouveau module, vous pouvez vérifier si un fichier existe comme ceci:
Vous pouvez (et devriez) toujours utiliser un
try/except
bloc lors de l'ouverture de fichiers:La pathlib module a plein de trucs sympas dans: pratique d'expansion, la vérification propriétaire du fichier, le chemin plus facile de rejoindre, etc. Il vaut la peine de vérifier. Si vous êtes sur une ancienne Python (version 2.6 ou version ultérieure), vous pouvez toujours installer pathlib avec pip:
Puis de l'importer comme suit:
OriginalL'auteur Cody Piersall
Préfèrent l'instruction try. Il est préférable de style et évite des conditions de course.
Ne prenez pas mon mot pour lui. Il y a beaucoup de soutien pour cette théorie. Voici un couple:
La cité d'Éviter des Conditions de Course (dev apple support) lien n'a pas l'appui de votre réponse. Elle ne concerne que l'aide temporaire des fichiers qui contiennent des informations sensibles sur la mauvaise conception des systèmes d'exploitation qui ne sont pas correctement sandbox temporaire des fichiers / répertoires via des autorisations restreintes. À l'aide de
try...except
n'aide pas à résoudre que problème de toute façon.Alors que ce lien peut répondre à la question, il est préférable d'inclure les parties essentielles de la réponse et de fournir le lien de référence. Lien-ne répond peut devenir non valide si la page liée changements. - Revue
Je ne pense pas que c'est link-seulement - en fait, elle a d'autres informations que le lien.
OriginalL'auteur pkoch
Maintenant disponible depuis Python 3.4, l'importation et l'instancier un
Path
de l'objet avec le nom de fichier, et de vérifier leis_file
méthode (notez que cela renvoie Vrai pour les liens symboliques pointant vers des fichiers normaux):Si vous êtes sur Python 2, vous pouvez backport la pathlib module de pypi,
pathlib2
, ou sinon vérifierisfile
de laos.path
module:Maintenant, le ci-dessus est probablement le meilleur pragmatique directe de réponse ici, mais il y a la possibilité d'une condition de concurrence (en fonction de ce que vous essayez d'accomplir), et le fait que l'implémentation sous-jacente utilise un
try
, mais Python utilisetry
partout dans sa mise en œuvre.Parce que Python utilise
try
partout, il n'y a vraiment pas de raison pour éviter une mise en œuvre qui l'utilise.Mais le reste de cette réponse tente de tenir compte de ces mises en garde.
Plus, beaucoup plus pédant réponse
Disponibles depuis le Python 3.4, l'utilisation de la nouvelle
Path
objet danspathlib
. Notez que.exists
n'est pas tout à fait le droit, parce que les répertoires ne sont pas des fichiers (sauf dans le unix sens que tout est un fichier).Nous avons donc besoin d'utiliser
is_file
:Ici de l'aide sur
is_file
:Prenons donc un fichier que nous savons, c'est un fichier:
Par défaut,
NamedTemporaryFile
supprime le fichier quand il est fermé (et se ferment automatiquement lorsque toutes les références existent).Si vous creusez dans la mise en œuvre, cependant, vous verrez que
is_file
utilisetry
:Des Conditions de course: Pourquoi nous aimons essayer
Nous comme
try
car elle évite des conditions de course. Avectry
, vous essayez simplement de lire votre fichier, s'attendant à être là, et si non, vous intercepter l'exception et effectuer que les secours comportement de sens.Si vous voulez vérifier qu'un fichier existe avant de tenter de le lire, et vous pourriez être le supprimer et alors vous pourriez être en utilisant plusieurs threads ou processus, ou un autre programme sait à propos de ce fichier et peut les supprimer, vous risquez de le un condition de course si vous vérifiez qu'il existe, parce que vous êtes alors de course l'ouvrir avant son condition (de son existence) des changements.
Conditions de course sont très difficiles à déboguer parce qu'il y a une très petite fenêtre dans laquelle ils peuvent causer votre programme à l'échec.
Mais si c'est votre motivation, vous peut obtenir la valeur d'un
try
déclaration à l'aide de lasuppress
gestionnaire de contexte.Éviter des conditions de course sans une instruction try:
suppress
Python 3.4, nous donne la
supprimer
gestionnaire de contexte (auparavant leignorer
gestionnaire de contexte), qui ne sémantiquement exactement la même chose en moins de lignes, mais aussi (au moins superficiellement) la satisfaction de la demande initiale afin d'éviter unetry
déclaration:Utilisation:
Plus tôt Pythons, vous pouvez rouler vos propres
suppress
, mais sanstry
sera plus bavarde que avec. Je ne crois c'est vraiment la seule réponse qui n'utilise pastry
à tout niveau dans le Python qui peut être appliqué avant le Python 3.4, car il utilise un gestionnaire de contexte à la place:Peut-être plus facile avec un essai:
D'autres options qui ne répondent pas à la demande", sans essayer":
isfile
de la docs:
Mais si vous examinez les source de cette fonction, vous verrez qu'il ne fait d'utiliser une instruction try:
Ca fais utilisant le chemin d'accès donné pour voir si elle peut obtenir des statistiques sur elle, la capture de
OSError
et puis de vérifier si c'est un fichier si il n'a pas de soulever l'exception.Si vous avez l'intention de faire quelque chose avec le fichier, je voudrais suggérer directement essayer avec un essai, sauf pour éviter une condition de course:
os.l'accès
Disponibles pour Unix et Windows est
os.access
, mais pour l'utiliser, vous devez passer les drapeaux, et il ne fait pas de distinction entre les fichiers et les répertoires. C'est plus utilisé pour tester si le réel en invoquant l'utilisateur a accès à une élévation de privilège de l'environnement:Il souffre également de la même condition de course des problèmes comme
isfile
. À partir de la docs:Éviter d'utiliser
os.access
. C'est un faible niveau de fonction qui a plus de possibilités pour l'utilisateur d'erreur que les objets de niveau supérieur et les fonctions évoquées ci-dessus.La critique d'une autre réponse:
Une autre réponse, dit ceci à propos de
os.access
:Cette réponse, dit-il préfère un non-Pythonic, le risque d'erreur de méthode, sans aucune justification. Il semble encourager les utilisateurs à utiliser les APIs bas-niveau sans les comprendre.
Il crée également un gestionnaire de contexte qui, par la reprise inconditionnelle
True
, permet à toutes les Exceptions (y compris lesKeyboardInterrupt
etSystemExit
!) pour passer en mode silencieux, ce qui est un bon moyen de cacher des bugs.Ce qui semble encourager les utilisateurs à adopter de mauvaises pratiques.
OriginalL'auteur Aaron Hall
Importation
os
rend plus facile à naviguer et d'effectuer des actions standard avec votre système d'exploitation.Pour référence, voir aussi Comment faire pour vérifier si un fichier existe à l'aide de Python?
Si vous avez besoin de haut niveau des opérations, de l'utilisation
shutil
.os.path.exists
retourne vrai pour les choses qui ne sont pas des fichiers, tels que des répertoires. Cela donne des faux positifs. Voir les autres réponses qui vousos.path.isfile
.OriginalL'auteur guerreroz
Tests pour les fichiers et les dossiers avec
os.path.isfile()
,os.path.isdir()
etos.path.exists()
En supposant que le "chemin" est un chemin d'accès valide, ce tableau nous montre ce qui est retourné par chaque fonction pour les fichiers et les dossiers:
Vous pouvez également tester si un fichier est un type de fichier à l'aide de
os.path.splitext()
pour obtenir l'extension (si vous ne la connaissez pas déjà)OriginalL'auteur Tom Fuller
En 2016, le meilleur moyen est encore à l'aide de
os.path.isfile
:Ou en Python 3, vous pouvez utiliser
pathlib
:pathlib
est python OOP solution pour les chemins. Vous pouvez faire beaucoup plus avec elle. Si vous avez juste besoin de vérifier l'existence, l'avantage n'est pas si grand.OriginalL'auteur KaiBuxe
Il ne semble pas comme il y a une véritable différence fonctionnelle entre les try/except et
isfile()
, de sorte que vous devriez utiliser qui on fait un sens.Si vous voulez lire un fichier, s'il existe, ne
Mais si vous voulais juste renommer le fichier si le fichier existe, et n'ont donc pas besoin de l'ouvrir, ne
Si vous voulez écrire dans un fichier, s'il n'existe pas, ne
Si vous avez besoin d'un fichier de verrouillage, c'est une autre affaire.
os.path.exists
retourne vrai pour les choses qui ne sont pas des fichiers, tels que des répertoires. Cela donne des faux positifs. Voir les autres réponses qui vousos.path.isfile
.Sur votre troisième exemple, je crée un lien nommé
filepath
avec le bon timing, et BAM, vous écrasez le fichier cible. Vous devriez faireopen(filepath, 'wx')
dans untry...except
bloc pour éviter le problème.Dans ton deuxième exemple, au moins dans Windows, vous obtiendrez un
OSError
sifilepath + '.old'
existe déjà: "Sur Windows, si l'heure d'été existe déjà, OSError seront soulevés, même si c'est un fichier; il peut y avoir aucun moyen de mettre en œuvre atomique renommer lorsque l'heure d'été à un nom de fichier."href="https://docs.python.org/3/library/os.html#os.replace" >Comme de Python 3.3,
os.replace
portably silencieuses remplacement du fichier de destination (il est identique àos.rename
'Linux comportement) (uniquement des erreurs si le nom de destination existe et est un répertoire). Si vous êtes coincé sur 2.x, mais Py3 utilisateurs ont eu une bonne option pour plusieurs années maintenant.Sur le
rename
exemple: Il doit toujours être fait avectry
/except
.os.rename
(ouos.replace
moderne Python) est atomique; faisant cela, cochez la case puis renommez introduit inutile de course et supplémentaires, les appels système. Il suffit de netry: os.replace(filepath, filepath + '.old') except OSError: pass
OriginalL'auteur chad
Vous pouvez essayer ce (safer):
La sortie serait:
Ensuite, en fonction du résultat, votre programme peut tout simplement continuer à courir à partir de là ou vous pouvez code de l'arrêter si vous le souhaitez.
try
Cette réponse n'est pas la question de l'OP. La vérification est un fichier existe n'est pas la même que de vérifier si vous pouvez l'ouvrir. Il y aura des cas où un fichier n'existe pas, mais pour une variété de raisons, vous ne pouvez pas l'ouvrir.
OriginalL'auteur philberndt
Bien que je recommande toujours à l'aide de
try
etexcept
déclarations, voici quelques possibilités pour vous (mon favori personnel est à l'aide deos.access
):Essayer d'ouvrir le fichier:
De l'ouverture du fichier sera toujours vérifier l'existence du fichier. Vous pouvez faire une fonction comme:
Si c'est Faux, il va arrêter l'exécution avec un unhanded IOError
ou OSError dans les versions ultérieures de Python. Pour intercepter l'exception,
vous devez utiliser un essai à l'exception de la clause. Bien sûr, vous pouvez toujours
utiliser un
try
à l'exception de l'énoncé comme (grâce à hsandtpour me faire penser):
Utilisation
os.path.exists(path)
:Il s'agira de vérifier l'existence de ce que vous spécifiez. Cependant, il vérifie les fichiers et répertoires méfiez-vous donc sur la façon dont vous l'utiliser.
Utilisation
os.access(path, mode)
:Cela permettra de vérifier si vous avez accès au fichier. Il va vérifier les autorisations. Basé sur le os.py la documentation, en tapant dans
os.F_OK
, il va vérifier l'existence de la voie. Cependant, l'utilisation de ce va créer un trou de sécurité, que l'on peut attaquer votre fichier en utilisant le temps de vérifier les autorisations et l'ouverture du fichier. Vous devriez plutôt aller directement à l'ouverture du fichier au lieu de vérifier les permissions. (L'aeap vs LBYP). Si vous n'allez pas ouvrir le fichier par la suite, et la seule vérification de son existence, alors vous pouvez utiliser ce.De toute façon, ici:
Je dois aussi mentionner qu'il y a deux façons que vous ne serez pas en mesure de vérifier l'existence d'un fichier. La question sera
permission denied
ouno such file or directory
. Si vous attrapez unIOError
, définir laIOError as e
(comme pour ma première option), puis tapez dansprint(e.args)
de sorte que vous pouvez espérer de déterminer votre problème. J'espère que cela aide! 🙂OriginalL'auteur Zizouz212
Date:2017-12-04
Toutes les solutions possibles ont été répertoriés dans d'autres réponses.
Une interface intuitive et défendable façon de vérifier si un fichier existe, c'est le suivant:
J'ai fait une liste exhaustive de triche pour votre référence:
OriginalL'auteur JawSaw
En Python 3.4 la langue fournit un nouveau module pour gérer les fichiers:
OriginalL'auteur Unai Sainz de la Maza
En outre,
os.access()
:Être
R_OK
,W_OK
, etX_OK
les drapeaux de test pour les autorisations (doc).OriginalL'auteur zgoda
Si le fichier est pour l'ouverture, vous pouvez utiliser une des techniques suivantes:
Mise à JOUR
Juste pour éviter la confusion et sur la base des réponses que j'ai eu, réponse actuelle trouve un fichier ou un répertoire avec le nom donné.
os.path.exists
retourne vrai pour les choses qui ne sont pas des fichiers, tels que des répertoires. Cela donne des faux positifs. Voir les autres réponses qui vousos.path.isfile
.suis le faux positif de problème également.
docs.python.org/3/library/os.path.html#os.path.exists Pour la déclaration ci-dessus de chris >>os.chemin d'accès.existe(chemin de) > Return True si le chemin d'accès fait référence à un chemin existant ou un descripteur de fichier ouvert. Renvoie la valeur False pour les brisures de liens symboliques. Sur certaines plates-formes, cette fonction peut retourner False si l'autorisation n'est pas accordée pour exécuter le système d'exploitation.stat() sur le fichier demandé, même si le chemin existe physiquement. Modifié dans la version 3.3: chemin d'accès peut maintenant être un nombre entier: valeur True est renvoyée si elle est un descripteur de fichier ouvert, False sinon. Modifié dans la version 3.6: Accepte un chemin, comme objet.
OriginalL'auteur bergercookie
SRC: http://www.pfinn.net/python-check-if-file-exists.html
OriginalL'auteur Pedro Lobito
Vous pouvez écrire de Brian suggestion sans
try:
.suppress
est partie de Python 3.4. Dans les anciennes versions, vous pouvez écrire rapidement vos propres supprimer:OriginalL'auteur Chris
Si vous avez importé NumPy déjà pour d'autres fins, il n'est pas nécessaire d'importer d'autres bibliothèques, comme
pathlib
,os
,paths
, etc.Cela renvoie true ou false en fonction de son existence.
OriginalL'auteur durjoy
Vérifier le fichier ou le répertoire existe
Vous pouvez suivre ces trois façons:
OriginalL'auteur Ali Hallaji
En ajoutant encore une légère variation qui n'est pas exactement reflété dans les autres réponses.
Cela permettra de traiter le cas de la
file_path
êtreNone
ou une chaîne vide.L'ajout d'une variante basée sur la suggestion de Shahbaz
L'ajout d'une variante basée sur la suggestion de Pierre, de Bois
if (x) return true; else return false;
est vraiment justereturn x
. Vos quatre dernières lignes peuvent devenirreturn os.path.isfile(file_path)
. Pendant que nous y sommes, l'ensemble de la fonction peut être simplifié commereturn file_path and os.path.isfile(file_path)
.Vous devez être prudent avec les
return x
dans le cas deif (x)
. Python allons considérer une chaîne vide, False dans le cas échéant, nous retourner une chaîne vide à la place d'un bool. Le but de cette fonction est de toujours revenir bool.Vrai. Dans ce cas cependant,
x
estos.path.isfile(..)
donc c'est déjà bool.os.path.isfile(None)
soulève une exception et c'est pourquoi j'ai ajouté le vérifier si. Je pourrais probablement juste de l'envelopper dans un try/except la place, mais j'ai senti qu'il était plus explicite de cette façon.return file_path and os.path.isfile(file_path)
OriginalL'auteur Marcel Wilson
Je suis l'auteur d'un paquet qui a été autour depuis environ 10 ans, et il a une fonction qui répond à cette question directement. En gros, si vous êtes sur un non-système de Windows, il utilise
Popen
pour accéder àfind
. Toutefois, si vous êtes sur Windows, il répliquefind
avec un efficace système de fichiers walker.Le code lui-même n'utilise pas de
try
bloc... à l'exception de déterminer le système d'exploitation et ainsi de pilotage vous à la "Unix"stylefind
ou de la main-builltfind
. Calendrier des tests ont montré que latry
a été plus rapide dans la détermination de l'OS, donc j'ai utilisé un il y a (mais nulle part ailleurs).Et le doc...
La mise en œuvre, si vous vous souciez de regarder, c'est ici:
https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190
OriginalL'auteur Mike McKerns
Voici un 1 ligne de commande Python pour la ligne de commande Linux de l'environnement. Je trouve cela TRÈS PRATIQUE car je ne suis pas un chaud Bash gars.
J'espère que cela est utile.
[ -f "${file}" ] && echo "file found" || echo "file not found"
(qui est le même queif [ ... ]; then ...; else ...; fi
).OriginalL'auteur Love and peace - Joe Codeswell
Vous pouvez utiliser les "OS" de la bibliothèque de Python:
os.path.exists
retourne vrai pour les choses qui ne sont pas des fichiers, tels que des répertoires. Cela donne des faux positifs. Voir les autres réponses qui vousos.path.isfile
.Johnson , os.chemin d'accès.il existe() vérifie si un chemin existe dans le système. CHEMIN d'accès peut être un RÉPERTOIRE ou un FICHIER. Il fonctionne parfaitement sur les deux cas. Veuillez essayer avec d'exemple
Donc, cette réponse œuvres. Grand. Forum le chemin d'accès n'est pas celle d'un fichier. C'est que quelle était la question? Pas de.
Il dépend. Si l'objectif de la détermination de l'existence d'un "fichier" est de savoir si le chemin existe déjà (et n'est donc pas un chemin où de nouvelles données peuvent être stockées sans supprimer d'autres informations), puis
exists
est très bien. Si l'objectif est de déterminer s'il est sécuritaire de le sans doute ouvrir un fichier existant, puis la critique est justifiée et il n'est pas assez précis. Malheureusement, l'OP ne précise pas qui est le but recherché (et ne sera probablement pas faire plus).OriginalL'auteur Pradip Das
En 2016, c'est encore sans doute la façon la plus simple pour vérifier si un fichier existe et si c'est un fichier:
isfile
est en fait qu'une méthode d'assistance qui utilise en interneos.stat
etstat.S_ISREG(mode)
dessous. Cetteos.stat
est d'un niveau inférieur méthode qui va vous fournir des informations détaillées sur les fichiers, les répertoires, les sockets, les tampons et les plus. Plus sur os.stat iciRemarque: Cependant, cette approche ne sera pas verrouiller le fichier en quelque sorte et, par conséquent, votre code peut devenir vulnérable à "temps de vérification et d'utilisation" (TOCTTOU) les bugs.
Donc le déclenchement d'exceptions est considéré comme acceptable, et Pythonic, approche pour le contrôle de flux dans votre programme. Et l'on devrait envisager la manipulation de fichiers manquants avec IOErrors, plutôt que de
if
consolidés (un conseil).OriginalL'auteur Inconnu