Quel est le moyen préféré de vérifier si un fichier existe et sinon de le créer?
Pour vérifier si un chemin est un fichier existant:
Retourne
True
si chemin est un fichier régulier existant. Ceci suit les liens symboliques, doncislink()
etisfile()
peuvent être vrais pour le même chemin.
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.
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%).
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é.