web-dev-qa-db-fra.com

Moyen pythonique de vérifier si un fichier existe?

Quel est le moyen préféré de vérifier si un fichier existe et sinon de le créer?

180
Juanjo Conti

Pour vérifier si un chemin est un fichier existant:

os.path.isfile(path)

Retourne True si chemin est un fichier régulier existant. Ceci suit les liens symboliques, donc islink() et isfile() peuvent être vrais pour le même chemin.

262
Desintegr

Au lieu de os.path.isfile, suggéré par d’autres, je suggère d’utiliser os.path.exists, qui vérifie que rien ne porte ce nom, et pas seulement s’il s’agit d’un fichier normal.

Ainsi:

if not os.path.exists(filename):
    file(filename, 'w').close()

Alternativement:

file(filename, 'w+').close()

Ce dernier créera le fichier s'il existe, mais pas autrement. Il échouera toutefois si le fichier existe, mais vous n’avez pas l’autorisation d’y écrire. C'est pourquoi je préfère la première solution.

74
user25148

Il me semble que toutes les autres réponses ici (jusqu'à présent) n'abordent pas la situation de concurrence critique qui se produit avec les solutions proposées.

Tout code dans lequel vous vérifiez d’abord l’existence des fichiers, puis quelques lignes plus tard dans votre programme, vous le créez, vous courez le risque que le fichier ne soit créé alors que vous ne cherchiez pas et ne causait pas de problèmes (ou que vous causiez le propriétaire de "cet autre fichier" problèmes).

Si vous voulez éviter ce genre de chose, je suggérerais quelque chose comme ceci (non testé):

import os

def open_if_not_exists(filename):
    try:
        fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
    except OSError, e:
        if e.errno == 17:
            print e
            return None
        else:
            raise
    else:
        return os.fdopen(fd, 'w')

Cela devrait ouvrir votre fichier en écriture s'il n'existe pas déjà et renvoyer un objet fichier. S'il existe, il affichera "Ooops" et renverra None (non testé et basé uniquement sur la lecture la documentation python , ce qui pourrait ne pas être correct à 100%).

37
Epcylon

Si (quand le fichier n'existe pas) vous voulez le créer vide, l'approche la plus simple est

with open(thepath, 'a'): pass

(en Python2.6 ou supérieur; en 2.5, cela nécessite une "importation du futur" en haut de votre module).

Si, au contraire, vous voulez laisser le fichier seul s’il existe, mais y mettre le contenu non vide, sinon, des approches plus compliquées basées sur if os.path.isfile(thepath):/else blocs sont probablement plus adapté.

13
Alex Martelli