Python: compruebe si existe un archivo o directorio

P

Hay bastantes formas de resolver un problema en la programación, y esto es cierto especialmente en Python. Muchas veces encontrará que varios módulos integrados o estándar sirven esencialmente para el mismo propósito, pero con una funcionalidad ligeramente diferente. Verificar si existe un archivo o directorio usando Python es definitivamente uno de esos casos.

Aquí hay algunas formas de verificar los archivos / directorios existentes y sus matices. A lo largo de estos ejemplos, asumiremos que nuestro directorio de trabajo actual tiene estos archivos y directorios:

drwxr-xr-x  3 scott  staff  102 Jan 12 10:01 dir
-rw-r--r--  1 scott  staff    5 Jan 12 09:56 file.txt
lrwxr-xr-x  1 scott  staff    8 Jan 12 09:56 link.txt -> file.txt
lrwxr-xr-x  1 scott  staff    3 Jan 12 10:00 sym -> dir

Observe que tenemos un directorio (dir), un archivo (file.txt), enlace simbólico de un archivo (link.txt) y un enlace simbólico de directorio (sym).

Comprobación de si existe un archivo

Podría decirse que esta es la forma más fácil de comprobar si existe un archivo y si es un archivo.

import os
os.path.isfile('./file.txt')    # True
os.path.isfile('./link.txt')    # True
os.path.isfile('./fake.txt')    # False
os.path.isfile('./dir')    # False
os.path.isfile('./sym')    # False
os.path.isfile('./foo')    # False

Tenga en cuenta que os.path.isfile sigue enlaces simbólicos, por lo que obtenemos True al comprobar link.txt.

isfile en realidad es solo un método auxiliar que utiliza internamente os.stat y stat.S_ISREG(mode) debajo, que veremos más adelante.

Comprobación de si existe un directorio

Como el isfile método, os.path.isdir es la forma más sencilla de comprobar si existe un directorio o si la ruta proporcionada es un directorio.

import os
os.path.isdir('./file.txt')    # False
os.path.isdir('./link.txt')    # False
os.path.isdir('./fake.txt')    # False
os.path.isdir('./dir')    # True
os.path.isdir('./sym')    # True
os.path.isdir('./foo')    # False

De nuevo, como isfile, os.path.isdir sigue enlaces simbólicos. También es un simple envoltorio os.stat y stat.S_ISDIR(mode), por lo que no obtendrá mucho más que comodidad.

Comprobando si alguno existe

Otra forma de verificar si existe una ruta (siempre que no le importe si la ruta apunta a un archivo o directorio) es usar os.path.exists.

import os
os.path.exists('./file.txt')    # True
os.path.exists('./link.txt')    # True
os.path.exists('./fake.txt')    # False
os.path.exists('./dir')    # True
os.path.exists('./sym')    # True
os.path.exists('./foo')    # False

Como puede ver, no le importa si la ruta apunta a un archivo, directorio o enlace simbólico, por lo que es casi como si estuviera usando isfile(path) or isdir(path). Pero en realidad, internamente, solo intenta llamar os.stat(path), y si se lanza un error, regresa False.

Avanzado

A lo largo del artículo, he mencionado cómo todos los métodos anteriores utilizan la os.stat método, así que pensé que sería útil echarle un vistazo. Este es un método de nivel inferior que le proporcionará información detallada sobre archivos, directorios, sockets, búferes y más.

Como todos los otros métodos que ya hemos cubierto, os.stat sigue enlaces simbólicos, por lo que si desea obtener la información estadística en un enlace, intente usar os.lstat() en lugar.

Dado que cada sistema operativo es diferente, los datos proporcionados por os.stat varía mucho. Estos son solo algunos de los datos que cada sistema operativo tiene en común:

  • st_mode: bits de protección
  • st_uid: ID de usuario del propietario
  • st_gid: ID de grupo del propietario
  • st_size: tamaño del archivo en bytes
  • st_atime: hora del último acceso
  • st_mtime: hora de la última modificación
  • st_ctime: hora del último cambio de metadatos en Unix o hora de creación en Windows

A continuación, puede utilizar estos datos con el stat módulo para obtener información interesante, como si una ruta apunta a un socket (stat.S_ISSOCK(mode)), o si un archivo es en realidad una tubería con nombre (stat.S_ISFIFO(mode)).

Si necesita alguna funcionalidad más avanzada, aquí es donde debe ir. Pero durante el 90% del tiempo que se trata de directorios y archivos, el os o os.path los módulos deberían tenerlo cubierto.

Aunque, un caso de uso válido podría ser cuando está realizando varias pruebas en el mismo archivo y desea evitar la sobrecarga del llamada al sistema stat para cada prueba. Entonces, si tiene que hacer bastantes pruebas, esto lo ayudará a hacerlo de manera más eficiente.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad