7 formas de comprobar si existe un archivo o una carpeta en Python

La biblioteca estándar de Python contiene la mayor parte de la funcionalidad que un desarrollador necesitaría para resolver un problema. En este tutorial, aprenderá diferentes formas de verificar la existencia de un archivo o directorio utilizando solo módulos integrados.

Verificar si un archivo o script está en el lugar correcto es crucial para cualquier programa CLI. Su programa podría volverse inútil si un archivo específico no está en su lugar en el momento de la ejecución.

En el tutorial de hoy, aprenderá algunas formas rápidas de comprobar si existe un archivo o una carpeta en Python.

Antes de empezar

Antes de ejecutar cualquiera de los siguientes comandos, asegúrese de tener Python 3 instalado en su sistema. Abre tu terminal y escribe el siguiente comando:

python --version
# Python 3.9.5, my result

Si tiene una versión 2.x, deberá usar el comando “python3”. Consulte nuestra guía de instalación de Python si no tiene Python 3 instalado.

Usaremos algunos archivos de prueba junto con este tutorial, así que asegúrese de crear los siguientes archivos:

touch testfile.txt
mkdir testdirectory/ 
touch testdirectory/otherfile.txt

Los comandos anteriores crean un archivo para jugar, un directorio de prueba y otro archivo dentro del directorio de prueba. Los archivos pueden estar vacíos ya que no necesitaremos leer su contenido,

Finalmente, usaremos Ipython como nuestro shell interactivo de Python, lo que brinda una bonita interfaz para trabajar. Esto es solo una mercancía, por lo tanto, no es estrictamente necesario.

pip install ipython

Después de hacer esto, obtendrá acceso a un hermoso shell de Python con solo escribir ipython.

Shell interactivo de Ipython que ejecuta Python 3.9

Ahora que está todo listo, profundicemos en las formas de verificar si existe una carpeta o un archivo en Python.

Probar, Abrir y Excepto

Esta es la opción más sencilla. Si intenta abrir un archivo que no existe, Python generará un FileNotFoundError.

In [1]: open('im-not-here.txt')
---------------------------------------------------------------------------
FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'

Podemos aprovechar esto y manejar la excepción en caso de que el archivo que estamos buscando no exista.

In [2]: try:
   ...:     file = open('im-not-here.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we\'re looking for doesn\' exist')
   ...:     exit()
   ...: 
Sorry the file we're looking for doesn't exist

En el código anterior, imprimimos un mensaje personalizado y detenemos la ejecución del programa si el archivo no existe.

Tenga en cuenta cómo el Salida() La función solo se ejecutará si se genera una excepción. Veamos qué sucede cuando el archivo que estamos buscando realmente existe.

In [2]: try:
   ...:     file = open('testfile.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we\'re looking for doesn\'t exist')
   ...:     exit()
   ...: 
<_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>

Observe cómo estamos cerrando el archivo justo después de abrirlo. Se considera una buena práctica según la documentación de Python.

Incluso si no estamos escribiendo en el archivo, se recomienda encarecidamente cerrar el archivo porque podría provocar múltiples problemas de rendimiento.

Si no queremos cerrar el archivo nosotros mismos, podemos usar el con administrador de contexto Asigna y libera recursos de manera precisa, por lo que no necesitaremos cerrar el archivo.

In [3]: try:
   ...:     with open('testfile.txt') as file:
   ...:         print(file)
   ...:         # No need to close the file
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we\'re looking for doesn\'t exist')
   ...:     exit()
   ...: 
   ...: 
<_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>

Este método es extremadamente útil cuando se escribe en archivos, pero resulta ineficaz si solo queremos comprobar si existe un archivo. Vamos a sumergirnos en otras opciones para lograr esto.

os.ruta.existe()

El módulo os proporciona múltiples funciones para interactuar con el sistema operativo. Para comprobar si existe un archivo o carpeta podemos utilizar el sendero.existe() función que acepta la ruta al archivo o directorio como argumento. Devuelve un valor booleano basado en la existencia de la ruta.

Nota: Una ruta es la ubicación única de un archivo o directorio en un sistema de archivos

En Python, el submódulo os.path contiene funciones diseñadas exclusivamente para operar con rutas de archivos. Todas estas funciones aceptan el argumento de ruta como cadenas o bytes, y puede decidir trabajar con rutas absolutas, por ejemplo:

/home/daniel/.bashrc

O con rutas relativas, según el directorio en el que esté ejecutando el script:

.bashrc
# Running the script in my home folder

Aquí hay varios ejemplos usando el os.ruta.existe() función, ejecutándose en el directorio donde se encuentran mis archivos de prueba:

In [1]: import os

In [2]: os.path.exists('testfile.txt')
Out[2]: True

In [3]: os.path.exists('testdirectory')
Out[3]: True

In [4]: os.path.exists('hey-i-dont-exist')
Out[4]: False

Como puedes ver, vuelve Cierto al probar con el archivo de prueba.txt archivo y el directorio de prueba carpeta, y Falso cuando el archivo no existe.

os.path.isfile()

Si solo quisiera probar la existencia de un archivo (no un directorio), llamaría al os.path.isfile() función.

In [1]: import os

In [2]: os.path.isfile('testfile.txt')
Out[2]: True

In [3]: os.path.isfile('testdirectory/')
Out[3]: False

In [4]: os.path.isfile('i-dont-even-exist')
Out[4]: False

In [5]: os.path.isfile('testdirectory/otherfile.txt')
Out[5]: True

Nota: En UNIX, todos los directorios terminan con una barra diagonal (/), mientras que en Windows usamos una barra diagonal inversa (\).

En el código de arriba esarchivo() retorno de función Falso en dos ocasiones, veamos por qué:

testdirectory/ es un directorio, por lo que no se considera un archivo. Esto no es del todo cierto ya que en Linux todo es un descriptor de archivo, pero Python trata los directorios de manera diferente solo por conveniencia (si intenta abrir un directorio obtendrá un Es un error de directorio) i-dont-even-exist apunta a un archivo que, irónicamente, no existe

os.ruta.isdir()

Si desea comprobar que un directorio está en el lugar correcto, deberá utilizar el os.ruta.isdir() función, que sólo devuelve Cierto si la ruta dada apunta a un directorio.

In [1]: import os

In [2]: os.path.isdir('testfile.txt')
Out[2]: False

In [3]: os.path.isdir('testdirectory')
Out[3]: True

In [4]: os.path.isdir('anotherfile.txt')
Out[4]: False

Tenga en cuenta cómo los ejemplos anteriores devuelven Falso incluso cuando la ruta apunta a un archivo que existe.

globo

El módulo glob proporciona funciones para trabajar con patrones tipo shell de Unix (por lo tanto, no funciona correctamente en Windows). Para verificar si un archivo coincide con un patrón dentro del directorio actual, puede usar la función glob.glob().

In [1]: import glob

In [2]: glob.glob('testfile.txt')
Out[2]: ['testfile.txt']

In [3]: glob.glob('testdirectory')
Out[3]: ['testdirectory']

En el código anterior, el patrón pasado a la función glob es una cadena normal que representa la ruta al archivo y directorio de prueba. Dado que ambas rutas existen, la función devuelve una lista con los nombres de ruta coincidentes dentro de ella.

Nota: Si el patrón no coincidiera, obtendría una lista vacía.

Teniendo en cuenta que podemos pasar patrones a la función global, ¿por qué no probar algunas de sus principales ventajas?

El siguiente código obtiene todas las rutas de archivo con una extensión .TXT y .py respectivamente:

In [4]: glob.glob('*.txt')
Out[4]: ['testfile.txt']

In [5]: glob.glob('*.py')
Out[5]: 
['pathlib-exists.py',
 'list-dir.py',
 'glob-file.py',
 'open-except.py',
 'subprocess-test.py',
 'isfile.py',
 'exists.py',
 'isdir.py']

Uso de la clase de ruta

La clase Path es una de las mejores formas de trabajar con rutas, ya que nos brinda una interfaz limpia para trabajar con rutas de archivo como objetos.

La guinda del pastel es que las instancias de Path tienen todos los métodos que necesitarías para obtener información sobre una determinada ruta. Esto incluye funcionalidades similares a las opciones anteriores.

Nota: Necesitará Python 3.4 o superior para usar la biblioteca pathlib

Los métodos de ruta que usará:

Comprobar si existe una ruta

In [1]: from pathlib import Path

In [2]: Path('testfile.txt').exists()
Out[2]: True

In [3]: Path('im-not-here.txt').exists()
Out[3]: False

In [4]: Path('testdirectory').exists()
Out[4]: True

Funciona igual que os.ruta.existe().

Comprobar si la ruta apunta a un archivo

In [5]: Path('testfile.txt').is_file()
Out[5]: True

In [6]: Path('testdirectory').is_file()
Out[6]: False

Equivalente a os.path.isfile().

Comprobar si la ruta apunta a un directorio

In [7]: Path('testfile.txt').is_dir()
Out[7]: False

In [8]: Path('testdirectory').is_dir()
Out[8]: True

Corresponde a os.ruta.isdir().

subproceso

Si eres un amante de los módulos de subprocesos, necesitarás conocer esta opción. Puede determinar si existe un archivo o una carpeta utilizando el comando de prueba.

Nota: los prueba El comando solo funciona en Unix.

Las siguientes banderas de prueba harán el trabajo:

prueba -e: Comprobar si existe una ruta
prueba -f: Comprobar si existe un archivo
prueba-d: Comprobar si existe una carpeta

En caso de que quiera sumergirse en más banderas de prueba, puede leer el manual ejecutando:

man test

Comprobación de una ruta con subproceso:

El siguiente código determina si existe una ruta al comparar el código de retorno del subproceso con 0.

Recuerda que en Linux, si un proceso salió bien, devolverá cero, si no, devolverá cualquier otro código.

In [1]: from subprocess import run

In [2]: run(['test', '-e', 'testfile.txt']).returncode == 0
Out[2]: True

In [3]: run(['test', '-e', 'im-not-here.txt']).returncode == 0
Out[3]: False

En la primera declaración, importamos el módulo de subproceso, luego usamos la función de ejecución y obtenemos su código de retorno.

Verificando la existencia de un archivo con subproceso

In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0
Out[4]: True

In [5]: run(['test', '-f', 'testdirectory']).returncode == 0
Out[5]: False

Verificando un directorio con subproceso:

In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0
Out[6]: False

In [7]: run(['test', '-d', 'testdirectory']).returncode == 0
Out[7]: True

No es tan recomendable usar esta opción ya que consume más recursos y no estamos obteniendo ninguna ventaja de ella.

Para resumir

Python es uno de los lenguajes de programación más utilizados para automatizar procesos al interactuar con el sistema operativo. Una cosa interesante que puede hacer con él es verificar si existe un archivo o una carpeta.

Los más sencillos para hacerlo son:

Apertura y manejo de excepciones de archivos de inmediato Usando el existe() función de la os.ruta o rutalib módulos.

En este tutorial aprendiste:

Cómo abrir un archivo y manejar excepciones en caso de que no exista El significado de las rutas 3 funciones diferentes la os.ruta submódulo proporciona para comprobar la existencia de un archivo o carpeta Unix utiliza barras diagonales (/), mientras que Windows utiliza barras invertidas (\)

Siguiente lectura: ¿Qué es un subproceso en Python? [5 Usage Examples]

Botón volver arriba