En este tutorial, aprenderemos a gestionar nuestros archivos con Python de forma uniforme, tanto si usas Linux como Windows.

Para ello, utilizaremos el módulo estándar os, disponible por defecto en cualquier instalación de Python 3. Se trata de un módulo fundamental para gestionar el sistema de archivos o interactuar con el sistema operativo.

Si eres principiante en Python, consulta nuestro artículo introductorio que te ayudará a instalar los requisitos previos y a adquirir las bases del lenguaje:

Lectura: Escribir tu primer script Python: guía para principiantes

💡
Nota: para seguir este tutorial, te recomiendo usar el modo interactivo de Python en lugar de un script. Esto hace que el uso sea más dinámico y sencillo para el aprendizaje.

Importar el módulo os

Para empezar a usar el módulo os, es necesario importarlo en tu sesión interactiva o script Python. El hecho de que el módulo esté presente en tu sistema no es suficiente, también debes importarlo. Esto se hace simplemente con la siguiente instrucción:

import os

Luego, podemos listar todas las funciones de este módulo con la siguiente instrucción:

# Listar los atributos y métodos del módulo os
dir(os)

# Salida esperada
[...]', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'chown', 'chroot', 'close', 'closerange', 'confstr', 'confst, 'environ', 'environb', 'error', 'eventfd', 'eventfd_read', 'eventfd_write', 'execl', 'execle', 'execlp', 'execlforkpty', 'fpathconf', 'fsdecode', 'fsencode', 'fspath', 'fstat', 'fstatvfs', 'fsync', 'ftruncate', 'fwalk', 'getvb', 'geteuid', 'getgid', 'getgrouplist', 'getgroups', 'getloadavg', 'getlogin', 'getpgid', 'getpgrp', 'getpid', y', 'kill', 'killpg', 'lchown', 'linesep', 'link', 'listdir', 'listxattr', 'lockf', 'login_tty', 'lseek', 'lstat'ty', 'pardir', 'path', 'pathconf', 'pathconf_names', 'pathsep', 'pidfd_open', 'pipe', 'pipe2', 'popen', 'posix_fareadlink', 'readv', 'register_at_fork', 'remove', 'removedirs', 'removexattr', 'rename', 'renames', 'replace', 'retscheduler', 'sched_param', 'sched_rr_get_interval', 'sched_setaffinity', 'sched_setparam', 'sched_setscheduler'setns', 'setpgid', 'setpgrp', 'setpriority', 'setregid', 'setresgid', 'setresuid', 'setreuid', 'setsid', 'setuid' 'stat', 'stat_result', 'statvfs', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'su', 'system', 'tcgetpgrp', 'tcsetpgrp', 'terminal_size', 'times', 'times_result', 'truncate', 'ttyname', 'umask', itid_result', 'waitpid', 'waitstatus_to_exitcode', 'walk', 'write', 'writev']

En Python, la función dir() permite obtener una lista de los atributos y métodos disponibles para un objeto. Esto incluye funciones, clases y otros objetos definidos en este módulo. No usaremos todas las funciones del módulo os, solo algunas relacionadas con la manipulación de archivos.

Si deseas obtener más información sobre una función específica, incluyendo su uso, parámetros y salidas posibles, consulta la documentación oficial: docs.python.org/3/library/os.html.

En programación, saber leer correctamente y comprender la documentación es una habilidad importante que marca la diferencia en términos de calidad del código y velocidad.

A continuación, se muestra un ejemplo del contenido de la documentación para la función os.listdir():

Fragmento de la documentación de Python que describe la función os.listdir()
Aprende a usar la función os.listdir() para listar los contenidos de un directorio en Python.

El título nos indica que esta función toma como parámetro una ruta (una cadena de caracteres). En la descripción que sigue, vemos que esta función devuelve una lista cuyo orden de elementos es aleatorio.

Realicemos una prueba sencilla que incluye la manipulación tanto de archivos como de carpetas con esta primera función:

# En Linux
os.listdir("/home/leo")

# En Windows
os.listdir("C:\\Users\\leo")

Como respuesta, deberías obtener una salida como esta:

>>> os.listdir("/home/leo/")
['.ssh', '.bashrc', '.config', 'Bureau', '.profile', ...]

Pasemos ahora a las funciones específicas para el procesamiento de archivos ofrecidas por el módulo os.

Uso de las funciones de gestión de archivos de Python

Verificar si un archivo existe

Empecemos con una tarea relativamente simple. Queremos verificar que un archivo existe en nuestro sistema. Para ello, podemos usar la función os.path.exists("ruta"). Aquí tienes un ejemplo:

# Verificar que un archivo existe en Linux
>>> os.path.exists("/etc/hosts")

True

# Verificar que un archivo existe en Windows
>>> os.path.exists("C:\\Windows\\System32\\drivers\\etc\\hosts")

True

# Ejemplo de respuesta para un archivo que no existe
>>> os.path.exists("C:\\Windows\\System32\\drivers\\etc\\nexistepas")

False

Esta función devuelve un booleano, es decir, un valor True (verdadero) o False (falso).

En Windows, recuerda escapar las barras invertidas (\) en tus rutas duplicándolas (\\). De lo contrario, obtendrás un error de sintaxis.

Esto facilita su uso en una condición. Aquí tienes un ejemplo en Windows:

# Condición sobre la existencia de un archivo
>>> if os.path.exists("C:\\Windows\\System32\\drivers\\etc\\nexistepas"):
...     print("Este archivo existe")
... else:
...     print("Este archivo no existe")
...

Este archivo no existe

También podemos almacenar este valor booleano en una variable para reutilizarlo más tarde. Aquí tienes un ejemplo en Linux:

# Uso de una variable para almacenar el resultado booleano
>>> archivo_existe = os.path.exists("/etc/hosts.bak")
>>> print(archivo_existe)

False

Finalmente, ten en cuenta que esta función también acepta rutas relativas (ruta desde la posición del script en el sistema de archivos y no de su raíz C: o /):

# Verificar la existencia de un archivo en ruta relativa
>>> os.path.exists("document.txt")

True

También podemos verificar que una ruta conduce a un archivo, y no a una carpeta. Para ello, usaremos la función os.path.isfile("ruta"):

# Verificar si una ruta conduce a un archivo o una carpeta
>>> os.path.isfile("C:\\Windows")

False

# Verificar si una ruta conduce a un archivo
>>> os.path.isfile("C:\\Windows\\System32\\cmd.exe")

True

# Verificar si una ruta conduce a un archivo (inexistente)
>>> os.path.isfile("C:\\Windows\\System32\\cmd.exe.bak")

False

En el primer ejemplo, la función devuelve False porque la ruta existe, pero conduce a una carpeta. Los dos ejemplos siguientes muestran la diferencia entre un archivo existente (y siendo un archivo) y un archivo que no existe.

Recuperar los metadatos de un archivo

Los metadatos son toda la información sobre el archivo en sí, en lugar de su contenido. Por ejemplo, su tamaño, fecha de modificación, fecha de creación, etc. En Linux, esto también incluye los permisos y el propietario del archivo. El módulo os ofrece varias funciones para acceder a esta información.

Para obtener el tamaño de un archivo en bytes, usaremos la función os.path.getsize("archivo"). Aquí tienes un ejemplo:

# Recuperación del tamaño de un archivo
>>> tamaño = os.path.getsize("/home/leo/.bashrc")
>>> print(f"El tamaño del archivo es: {tamaño} bytes")

El tamaño del archivo es: 6761 bytes

Varias funciones permiten encontrar las fechas de las últimas modificaciones (os.path.getmtime("ruta")), accesos (os.path.getatime("ruta")) y cambios de metadatos (os.path.getctime("ruta")).

Atención, getctime no contiene la fecha de creación del archivo, sino la fecha de la última modificación de los metadatos (propietario, permisos, etc.).

Estas devuelven las fechas en segundos desde el 1 de enero de 1970 (formato epoch). Puedes convertir este valor en una fecha legible con el módulo estándar datetime (que también hay que importar):

# Importar el módulo estándar de manipulación de fechas
>>> import datetime

# Recuperar la fecha de última modificación de un archivo
>>> fecha_modificacion = os.path.getmtime("document.txt")

# Transformación a una sintaxis legible de la fecha
>>> fecha_legible = datetime.datetime.fromtimestamp(fecha_modificacion)
>>> print(f"El archivo fue modificado por última vez el: {fecha_legible}")


El archivo fue modificado por última vez el: 2023-10-01 20:34:57.070011

Sin embargo, generalmente es conveniente usar la función os.stat(), que permite obtener toda esta información en un mismo objeto:

# Ruta al archivo que queremos analizar
>>> archivo = "/home/leo/Documents/document.txt"

# Uso de os.stat para obtener información sobre el archivo
# Esta función devuelve un objeto que contiene diversas informaciones sobre el archivo
>>> info_archivo = os.stat(archivo)
>>> print(info_archivo)

os.stat_result(st_mode=33204,st_ino=3462458,st_dev=2049,st_nlink=1,st_uid=1000,st_gid=1000,st_size=8,st_atime=1741204820,st_mtime=1741204801,st_ctime=1741204801)

# Acceso al atributo st_mtime del objeto devuelto por os.stat
>>> print(info_archivo.st_mtime)

# Ejemplo de salida:
1741204801

Como habrás comprendido, los atributos del objeto stat st_mtime, st_atime y st_ctime permiten acceder respectivamente a la fecha de última modificación, acceso y cambio de metadatos.

Para hacer un ejemplo más completo, te propongo el siguiente ejercicio:

  • Escribe un pequeño script info_file.py que verifique la fecha de modificación, acceso y modificación de los metadatos de un archivo cuya ruta está escrita de forma permanente (en una variable);
  • El script también debe mostrar el tamaño del archivo en bytes;
  • Incluye una función de conversión del tiempo con datetime;
  • Verifica primero que el archivo exista y que sea un archivo;

Aquí está la respuesta a este ejercicio:

import os
import datetime

def convertir_timestamp(timestamp):
    """Convierte un timestamp en una fecha legible."""
    return datetime.datetime.fromtimestamp(timestamp)

def mostrar_info_archivo(ruta_archivo):
    """Muestra la información sobre un archivo."""
    # Verificar si el archivo existe y es un archivo
    if not os.path.exists(ruta_archivo):
        print(f"El archivo '{ruta_archivo}' no existe.")
        return

    if not os.path.isfile(ruta_archivo):
        print(f"La ruta '{ruta_archivo}' no es un archivo.")
        return

    # Recuperar la información del archivo
    info_archivo = os.stat(ruta_archivo)

    # Mostrar el tamaño del archivo
    tamaño = info_archivo.st_size
    print(f"Tamaño del archivo: {tamaño} bytes")

    # Mostrar las fechas de modificación, acceso y cambio de metadatos
    fecha_modificacion = convertir_timestamp(info_archivo.st_mtime)
    fecha_acceso = convertir_timestamp(info_archivo.st_atime)
    fecha_cambio = convertir_timestamp(info_archivo.st_ctime)

    print(f"Fecha de última modificación: {fecha_modificacion}")
    print(f"Fecha de último acceso: {fecha_acceso}")
    print(f"Fecha de último cambio de metadatos: {fecha_cambio}")

# Ruta del archivo (reemplazar por la ruta real del archivo)
ruta_archivo = "/home/leo/Documents/document.txt"

# Llamar a la función para mostrar la información del archivo
mostrar_info_archivo(ruta_archivo)

También he reutilizado lo que hemos aprendido anteriormente integrando una prueba de existencia del archivo con la función os.path.isfile(). Aquí tienes una posible salida de este script:

$ python3 miprograma.py
Tamaño del archivo: 1430 bytes
Fecha de última modificación: 2025-05-23 20:20:39.926297
Fecha de último acceso: 2025-05-23 20:20:40.263022
Fecha de último cambio de metadatos: 2025-05-23 20:20:39.926297

Estas funciones son particularmente útiles para la gestión de archivos, por ejemplo, para ordenar o filtrar archivos según su tamaño o fecha de modificación.

Eliminar o renombrar un archivo

La gestión de archivos a menudo incluye operaciones de eliminación o renombrado. Una vez más, es el módulo os el que usaremos para estas tareas. Para eliminar un archivo, podemos usar la función os.remove("ruta").

Atención, no hay vuelta atrás con este comando, el archivo se eliminará definitivamente (sin papelera de reciclaje).

Esta función toma como argumento la ruta al archivo a eliminar.

>>> os.remove("archivo_a_eliminar.txt")

Para evitar errores, podemos combinar esto con la función os.path.exists vista anteriormente. De lo contrario, esta operación lanzará una excepción FileNotFoundError.

>>> if os.path.exists("archivo_a_eliminar.txt"):
...     os.remove("archivo_a_eliminar.txt")
...     print("El archivo ha sido eliminado con éxito.")
... else:
...     print("El archivo no existe.")

Para renombrar un archivo o moverlo a otra ubicación, podemos usar la función os.rename("archivo", "nuevo_archivo"). Esta función toma dos argumentos: el nombre/ruta de origen y el de destino.

# Renombrar un archivo en Python con el módulo os
>>> os.rename("document.txt", "nuevo_nombre.txt")

Esta función también se puede usar para mover un archivo a otro directorio especificando una ruta de destino completa.

# Cambiar de lugar un archivo en Python
>>> os.rename("document.txt", "/ruta/hacia/nuevo_directorio/nuevo_nombre.txt")

Usando estas funciones, puedes gestionar fácilmente los archivos de tu sistema, ya sea para eliminarlos o renombrarlos según tus necesidades.

Conclusión

El módulo os es muy útil para gestionar archivos e interactuar con el sistema operativo de forma uniforme, tanto en Linux como en Windows.

Dominando estas funciones básicas, podrás crear scripts Python eficientes para automatizar la gestión de tus archivos.

Categorizado en:

Python,