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 múltiples incorporados o estándar ...

Hay bastantes formas de resolver un problema en programación, y esto es cierto especialmente en python. Muchas veces encontrará que múltiples 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:

1
2
3
4
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

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

Comprobar si existe un archivo

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

1
2
3
4
5
6
7
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 Verdadero al verificar enlace.txt.

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

Comprobar si existe un directorio

Al igual que el método isfile, os.path.isdir es la forma más fácil de verificar si existe un directorio, o si la ruta dada es un directorio.

1
2
3
4
5
6
7
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, al igual que isfile, os.ruta.isdir sigue enlaces simbólicos. También es solo un contenedor simple alrededor de os.stat y stat.S_ISDIR (modo), por lo que no obtiene mucho más que conveniencia de él.

Comprobar si 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.

1
2
3
4
5
6
7
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 importa si la ruta apunta a un archivo, directorio o enlace simbólico, por lo que es casi como si estuviera usando isfile(ruta) o isdir(ruta). Pero en realidad, internamente solo intenta llamar a os.stat(path), y si se produce un error, devuelve False.

Avanzado

A lo largo del artículo he estado mencionando cómo todos los métodos anteriores utilizan el método os.stat, así que pensé 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.

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

Dado que cada sistema operativo es diferente, los datos proporcionados por os.stat varían 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

Luego puede usar estos datos con el módulo stat para obtener información interesante, como si una ruta apunta a un socket (stat.S_ISSOCK(modo)), o si un archivo es en realidad una canalización con nombre (stat.S_ISFIFO (modo)).

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

Aunque, un caso de uso válido podría ser cuando estás haciendo varias pruebas en el mismo archivo y quieres evitar la sobrecarga de la [llamada al sistema de estadísticas](https://en.wikipedia.org/wiki/Stat_ %28system_call%29) para cada prueba. Entonces, si tiene bastantes pruebas que hacer, esto lo ayudará a hacerlo de manera más eficiente. nte.