Python: compruebe si existe un archivo o directorio

    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.

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *