103 votes

Quelle est une bonne façon de gérer les exceptions lors de la lecture d'un fichier en python ?

Je veux lire un fichier .csv en python.

  • Je ne sais pas si le fichier existe.
  • Ma solution actuelle est la suivante. Elle me semble peu soignée car les deux tests d'exception distincts sont maladroitement juxtaposés.

Y a-t-il un moyen plus joli de le faire ?

import csv    
fName = "aFile.csv"

try:
    with open(fName, 'rb') as f:
        reader = csv.reader(f)
        for row in reader:
            pass #do stuff here

except IOError:
    print "Could not read file:", fName

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 avec os.path.exists(file) et os.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 pas csv.Error en raison du fait que le fichier n'est pas au format CSV lorsque Dialect.strict=True ou Error 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.

1voto

atevm Points 324

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

-14voto

Zac Brown Points 1120

En complément de l'exemple de @Josh ;

fName = [FILE TO OPEN]
if os.path.exists(fName):
    with open(fName, 'rb') as f:
        #add you code to handle the file contents here.
elif IOError:
    print "Unable to open file: "+str(fName)

De cette façon, vous pouvez tenter d'ouvrir le fichier, mais s'il n'existe pas (s'il lève une IOError), alerter l'utilisateur !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X