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:
Te puede interesar:Explicación de la pirámidedrwxr-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
Contenido
Podría decirse que esta es la forma más fácil de comprobar si existe un archivo y si es un archivo.
Te puede interesar:Comandos Popen de subprocesos y SO de Pythonimport 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ónst_uid
: ID de usuario del propietariost_gid
: ID de grupo del propietariost_size
: tamaño del archivo en bytesst_atime
: hora del último accesost_mtime
: hora de la última modificaciónst_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.