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 *