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
Contenido
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贸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.