HOWTO · Python
Manejo de excepciones de archivos abiertos en Python
En Python, cuando el archivo al que queremos acceder no existe, se lanza una excepción conocida como `FileNotFoundError`. Este artículo lo guiará para detectar la excepción y ejecutar el resto del código.
En esta página
Cuando Python no encuentra la ruta que se pasa a open(), genera FileNotFoundError. Captura ese error específico alrededor de la operación de apertura, elige una acción de recuperación útil y permite que el resto del programa continúe. Usa with open(...) para que los archivos que se abran correctamente se cierren de forma fiable.
Modos de archivo y valor devuelto por open()
La función integrada open() recibe una ruta y un modo, y devuelve un objeto de archivo. Al llamarla, no carga el archivo completo; después, métodos como read() obtienen su contenido. El modo predeterminado, r, abre un archivo de texto para lectura y requiere que la ruta corresponda a un archivo existente. Usa w para crear o reemplazar un archivo y a para añadir contenido al final. Estos modos de escritura pueden crear un archivo que no existe, así que elígelos solo cuando quieras escribir. Añade b a un modo, como rb, para trabajar con bytes en lugar de texto decodificado.
Una ruta relativa se resuelve desde el directorio de trabajo actual del proceso, que puede ser distinto del directorio donde se encuentra el script de Python. Si una ruta falla de forma inesperada, comprueba el nombre exacto del archivo, su ortografía, los directorios superiores y el directorio de trabajo del programa. Una ruta absoluta evita depender de ese directorio, aunque también debe identificar un archivo accesible.
Ejecuta este ejemplo. Las etiquetas o los textos visibles del bloque de código y de su salida se conservan en inglés.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "notes.txt"
path.write_text("Read this line.", encoding="utf-8")
with path.open(encoding="utf-8") as file:
print(file.read())
Read this line.
Por qué open() genera FileNotFoundError
En modo de lectura, si la ruta no corresponde a un archivo existente, se genera FileNotFoundError al llamar a open(). Python indica la ruta que intentó usar; interpreta las rutas relativas desde el directorio de trabajo actual. Esto suele ocurrir porque el programa se ejecuta desde un directorio distinto del esperado o porque está mal escrito el nombre de un archivo o de algún directorio de la ruta. El error se produce al abrir el archivo, antes de que haya un objeto de archivo disponible; por tanto, no lo causa una llamada posterior a read().
El mismo error puede producirse si no existe algún directorio superior de la ruta indicada. Comprobar de antemano si la ruta existe puede ayudar a diagnosticar el problema, pero no evita que el archivo cambie entre la comprobación y la apertura. Si el programa necesita recuperarse, gestiona el resultado de la propia operación de apertura.
Manejar errores al abrir archivos con try y except
Coloca dentro de un bloque try la operación que podría fallar y especifica FileNotFoundError en la cláusula except correspondiente. Cuando se produce ese error, Python omite las instrucciones restantes de ese bloque try y ejecuta el manejador correspondiente. Después de la instrucción completa try/except, la ejecución continúa. Si se produce otra excepción y no hay un manejador que coincida, esta se propaga a quien llamó al código; capturar este error no resuelve todos los problemas de acceso a archivos.
Al usar with open(...), el archivo se cierra al terminar el bloque, incluso si se produce un error después de abrirlo correctamente. Si la apertura falla, el bloque with no llega a ejecutarse. Elige una acción de recuperación que sea útil para el programa; por ejemplo, indica qué ruta no se encontró, pide otra ruta a quien llamó al programa o usa una alternativa documentada. No trates silenciosamente la ausencia de una entrada como si fueran datos válidos.
Ejecuta este ejemplo. Las etiquetas o los textos visibles del bloque de código y de su salida se conservan en inglés.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "missing.txt"
try:
with path.open(encoding="utf-8") as file:
print(file.read())
except FileNotFoundError:
print("Input file was not found; continuing without it.")
print("Program continues.")
Input file was not found; continuing without it.
Program continues.