J'ai mis à jour la réponse de Tim Pietzcker, car elle utilise Python 2 qui n'est plus maintenu.
J'ai d'abord essayé d'éditer la réponse, mais j'ai obtenu le message suivant : la file d'attente d'édition est pleine, donc je n'ai pas pu.
import errno
fname = "no_such_a_file.txt"
try:
f = open(fname, 'rb')
except OSError as e:
if e.errno == errno.ENOENT:
print(
f"No such a file or directory (errno: { e.errno }):",
fname, file=sys.stderr
)
else:
# for other OS errno codes you may want to write
# your more specific error messages which
print(
f"Cannot oppen file (errno: { e.errno } ):",
fname,
file=sys.stderr
)
sys.exit(os.EX_OSFILE)
with f:
reader = csv.reader(f)
for row in reader:
pass #do stuff here
J'ai également apporté quelques améliorations mineures :
Le code est autonome.
Vous devez vérifier le errno de votre exception, ce qui vous aide à réduire l'erreur
Vous devez écrire les messages d'erreur et de journal dans sys.stderr
et non dans sys.stdout
(par défaut pour l'impression), car vous pouvez alors rediriger vos messages d'erreur dans un fichier différent.
Vous devez renvoyer un sortie non nulle code ( documenté ici ) qui est indispensable si vous voulez rendre votre code python utilisable dans un environnement Unix, comme un shell script :
n/env bash
set -euo pipefail
if ./read_file.py 2> error.log
then
echo "do stuff"
else
exit_code=$?
echo "file is not readable, exit code: $exit_code" > /dev/stderr
exit $exit_code
fi
0 votes
Si un fichier inexistant n'est pas un cas d'erreur mais une circonstance probable, il faut alors vérifier et traiter son absence/non lisibilité explicitement avant (et en outre, à) la
try
pourrait en valoir la peine. Cela peut être fait avecos.path.exists(file)
etos.access(file, os.R_OK)
respectivement. Une telle vérification ne peut jamais être exempte d'une condition de course, mais la disparition de fichiers est rarement une circonstance normale ;)2 votes
Les réponses à cette question devraient probablement être mises à jour afin d'inclure l'utilisation de l'outil d'évaluation de la qualité de l'eau.
pathlib
qui rend ce problème beaucoup plus facile, et devrait probablement être une pratique standard de Python (d'autant plus qu'il a également été rétroporté dans la version 2.7).0 votes
Tandis que celui-ci attrape
IOError
il n'attrape pascsv.Error
en raison du fait que le fichier n'est pas au format CSV lorsqueDialect.strict=True
ouError
pour toute autre erreur (selon la documentation du paquet CSV), donc un essai externe, ou simplement la vérification de l'existence du fichier, puis un essai interne pour les exceptions CSV est probablement la bonne réponse.0 votes
@pinkspikyhairman Oui, dans votre gestionnaire d'exceptions, vous devez décider quels types d'erreurs vous voulez traiter. Voir ici pour savoir comment gérer plusieurs types d'erreurs spécifiques : stackoverflow.com/questions/6470428/