O que é uma boa maneira de lidar com exceções ao tentar ler um arquivo em python?

Quero ler A.ficheiro csv em python.

    Não sei se o ficheiro existe.
  • a minha solução actual está em baixo. Parece-me desleixado porque os dois testes de excepção separados são estranhamente justapostos.
Há maneira mais bonita de o fazer?

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
Author: Charles Holbrow, 2011-04-12

4 answers

Acho que percebi mal o que me perguntaram. Re-reading, parece que a resposta do Tim é o que queres. Deixe-me apenas acrescentar isto, no entanto: se você quiser pegar uma exceção de open, então open tem que ser embrulhado em um try. Se a chamada para open estiver no cabeçalho de a with, então o with tem de estar num try para apanhar a excepção. Não há maneira de contornar isso. A resposta é: "à Maneira do Tim" ou "não, estás a fazê-lo correctamente".".

anterior resposta inútil a que se referem todos os comentários:

import os

if os.path.exists(fName):
   with open(fName, 'rb') as f:
       try:
           # do stuff
       except : # whatever reader errors you care about
           # handle error

 22
Author: Josh Caswell, 2011-04-11 21:23:00
Que tal isto:
try:
    f = open(fname, 'rb')
except IOError:
    print "Could not read file:", fname
    sys.exit()

with f:
    reader = csv.reader(f)
    for row in reader:
        pass #do stuff here
 22
Author: Tim Pietzcker, 2011-04-11 21:01:58

Aqui está um exemplo de leitura / escrita. As declarações com asseguram que a declaração close () será chamada pelo objeto de arquivo, independentemente se uma exceção é lançada. http://effbot.org/zone/python-with-statement.htm

import sys

fIn = 'symbolsIn.csv'
fOut = 'symbolsOut.csv'

try:
   with open(fIn, 'r') as f:
      file_content = f.read()
      print "read file " + fIn
   if not file_content:
      print "no data in file " + fIn
      file_content = "name,phone,address\n"
   with open(fOut, 'w') as dest:
      dest.write(file_content)
      print "wrote file " + fOut
except IOError as e:
   print "I/O error({0}): {1}".format(e.errno, e.strerror)
except: #handle other exceptions such as attribute errors
   print "Unexpected error:", sys.exc_info()[0]
print "done"
 8
Author: edW, 2016-02-25 20:44:36

Adicionando ao exemplo 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)

Desta forma você pode tentar abrir o arquivo, mas se ele não existe (se ele levanta um IOError), Alerte o usuário!

 -4
Author: Zac Brown, 2011-04-11 21:04:14