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

trypodrí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;)pathlibmó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.Errordebido a que el archivo no tiene formato CSV cuandoDialect.strict=TrueoErrorpor 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,opendebe estar envuelto en untry. Si la llamada aopenestá en el encabezado de awith, entonceswithdebe estar en atrypara 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 errorfuente
fNamesea 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 herefuente
withbloque. Entonces, si ocurre una excepción entre eltrybloque que contiene la llamada aopeny lawithdeclaració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 unoOSErroro en suExceptionlugar? ``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 existexcepció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 simpleTrueyifno detecta ninguna excepción.>>> if IOError: print "That's not an exception handler"