web-dev-qa-db-fra.com

Vérifiez si un répertoire contient un fichier avec une extension donnée

Je dois vérifier le répertoire actuel et voir si un fichier avec une extension existe. Ma configuration n'aura (généralement) qu'un seul fichier avec cette extension. J'ai besoin de vérifier si ce fichier existe, et si c'est le cas, exécutez une commande.

Cependant, il exécute le else plusieurs fois car il existe plusieurs fichiers avec des extensions alternatives. Il ne doit exécuter le else que si le fichier n'existe pas, pas une fois pour tous les autres fichiers. Mon exemple de code est ci-dessous.


Le répertoire est structuré comme suit:

dir_________________________________________
    \            \            \            \     
 file.false    file.false    file.true    file.false

Quand je cours:

import os
for File in os.listdir("."):
    if File.endswith(".true"):
        print("true")
    else:
        print("false")

La sortie est:

false
false
true
false

Le problème avec ceci est que si je remplace print("false") par quelque chose d'utile, il l'exécutera plusieurs fois.

Edit: J'ai posé cette question il y a 2 ans, et il y a toujours une activité très légère, donc, je voudrais laisser ceci ici pour d'autres personnes: http://book.pythontips.com/en/latest/for_-_else.html#else-clause

15
spikespaz

Vous pouvez utiliser le bloc else du for:

for fname in os.listdir('.'):
    if fname.endswith('.true'):
        # do stuff on the file
        break
else:
    # do stuff if a file .true doesn't exist.

Le else attaché à un for sera exécuté chaque fois que le break à l'intérieur de la boucle est pas réalisé. Si vous pensez qu'une boucle for est un moyen de rechercher quelque chose, alors break indique si vous avez trouvé ce quelque chose. else est exécuté lorsque vous n'avez pas trouvé ce que vous cherchiez.

Alternativement:

if not any(fname.endswith('.true') for fname in os.listdir('.')):
    # do stuff if a file .true doesn't exist

De plus, vous pouvez utiliser le module glob au lieu de listdir:

import glob
# stuff
if not glob.glob('*.true')`:
    # do stuff if no file ending in .true exists
22
Bakuriu

Si vous souhaitez uniquement vérifier qu'un fichier se termine par une extension particulière, utilisez any.

import os
if any(File.endswith(".true") for File in os.listdir(".")):
    print("true")
else:
    print("false")
10
Kevin

Vous devez utiliser le module glob pour rechercher exactement les fichiers qui vous intéressent:

import glob

fileList = glob.glob("*.true")
for trueFile in fileList:
    doSomethingWithFile(trueFile)
4
bgporter