Quiero leer un archivo .csv en python.
- No sé si el archivo existe.
- Mi solución actual está a continuación. Me parece descuidado porque las dos pruebas de excepción separadas se yuxtaponen de manera incómoda.
¿Existe una forma más bonita de hacerlo?
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
python
python-2.7
exception
file-io
Charles Holbrow
fuente
fuente
try
podría valer la pena. Esto se puede hacer conos.path.exists(file)
yos.access(file, os.R_OK)
respectivamente. Sin embargo, dicha verificación nunca puede estar libre de una condición de carrera, pero los archivos que desaparecen rara vez son una circunstancia normal;)pathlib
módulo, lo que hace que este problema sea mucho más fácil, y probablemente debería ser una práctica estándar de Python (especialmente porque también se retroportó a 2.7).IOError
, no se detectacsv.Error
debido a que el archivo no tiene formato CSV cuandoDialect.strict=True
oError
por cualquier otro error (de acuerdo con los documentos del paquete CSV), por lo que un intento externo, o simplemente la verificación del archivo, entonces existe un intento interno para las excepciones CSV probablemente la respuesta correcta.Respuestas:
Supongo que entendí mal lo que me preguntaban. Releyendo, parece que la respuesta de Tim es lo que quieres. Sin embargo, permítame agregar esto: si desea capturar una excepción de
open
,open
debe estar envuelto en untry
. Si la llamada aopen
está en el encabezado de awith
, entonceswith
debe estar en atry
para detectar la excepción. No hay forma de evitar eso.Entonces la respuesta es: "a la manera de Tim" o "No, lo estás haciendo correctamente".
Respuesta anterior inútil a la que se refieren todos los comentarios:
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
fuente
fName
sea el nombre de algún archivo que, incluso si se queda, no se puede abrir por cualquier motivo, por ejemplo, si es un directorio o no tiene permisos que permitan que el proceso de ejecución lo lea.Qué tal esto:
try: f = open(fname, 'rb') except OSError: print "Could not open/read file:", fname sys.exit() with f: reader = csv.reader(f) for row in reader: pass #do stuff here
fuente
with
bloque. Entonces, si ocurre una excepción entre eltry
bloque que contiene la llamada aopen
y lawith
declaración, el archivo no se cierra. En este caso, donde las cosas son muy simples, no es un problema obvio, pero aún podría representar un peligro al refactorizar o modificar el código. Dicho esto, no creo que haya una mejor manera de hacer esto (que no sea la versión original).FileNotFoundError.mro()
es[<class 'FileNotFoundError'>, <class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]
yIOError.mro()
es[<class 'OSError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]
. ¿Qué tal usar unoOSError
o en suException
lugar? ``Aquí hay un ejemplo de lectura / escritura. Las declaraciones with aseguran que el objeto de archivo llamará a la declaración close () independientemente de si se lanza una excepción. 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"
fuente
fname = 'filenotfound.txt' try: f = open(fname, 'rb') except FileNotFoundError: print("file {} does not exist".format(fname)) file filenotfound.txt does not exist
excepción FileNotFoundError Se genera cuando se solicita un archivo o directorio pero no existe. Corresponde a errno ENOENT.
https://docs.python.org/3/library/exceptions.html
Esta excepción no existe en Python 2.
fuente
Añadiendo al ejemplo 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 esta manera, puede intentar abrir el archivo, pero si no existe (si genera un IOError), ¡avise al usuario!
fuente
bool(IOError)
es simpleTrue
yif
no detecta ninguna excepción.>>> if IOError: print "That's not an exception handler"