Gestión de Archivos y Comandos del Sistema con el Módulo os en Python

Introducción al Módulo os

El módulo os en Python actúa como una interfaz fundamental para interactuar con el sistema operativo subyacente. Proporciona un conjunto robusto de herramientas que permiten a los desarrolladores manipular el sistema de archivos, gestionar rutas, acceder a variables de entorno y ejecutar comandos a nivel de sistema, todo ello manteniendo la portabilidad entre diferentes plataformas como Windows, Linux y macOS.

Operaciones con el Sistema de Archivos

La gestión de directorios y archivos es una de las capacidades más utilizadas de este módulo. A continuación, se detallan las operaciones principales para navegar y modificar la estructura de carpetas.

  • os.getcwd(): Recupera la ruta absoluta del directorio de trabajo actual.
  • os.chdir(ruta): Cambia el directorio de trabajo actual a la ruta especificada.
  • os.listdir(ruta='.'): Devuelve una lista con los nombres de las entradas (archivos y carpetas) en el directorio indicado.
  • os.mkdir(ruta): Crea un único directorio. Falla si la ruta padre no existe o si el directorio ya existe.
  • os.makedirs(ruta): Crea directorios de forma recursiva, generando todas las carpetas intermedias necesarias.
  • os.remove(ruta): Elimina un archivo específico. No puede usarse con directorios.
  • os.rmdir(ruta): Elimina un directorio, pero solo si está completamente vacío.
  • os.removedirs(ruta): Elimina directorios de forma recursiva, siempre y cuando estén vacíos.
import os

# Obtener y cambiar el directorio de trabajo
directorio_inicial = os.getcwd()
print(f"Ubicación actual: {directorio_inicial}")

nueva_ruta = os.path.join(directorio_inicial, "proyectos", "backend")
if not os.path.exists(nueva_ruta):
    os.makedirs(nueva_ruta)
    
os.chdir(nueva_ruta)
print(f"Directorio actualizado a: {os.getcwd()}")

# Listar contenido
contenido = os.listdir(".")
print(f"Elementos en el directorio: {contenido}")

Manipulación y Análisis de Rutas

El submódulo os.path ofrece funciones especializadas para construir, deconstruir y verificar rutas de archivos de manera segura e independiente del sistema operativo.

  • os.path.join(ruta, *rutas): Concatena componentes de ruta utilizando el separador correcto del sistema.
  • os.path.abspath(ruta): Convierte una ruta relativa en su representación absoluta.
  • os.path.basename(ruta): Extrae el nombre del archivo o la última carpeta de la ruta.
  • os.path.dirname(ruta): Extrae la ruta del directorio padre, descartando el último componente.
  • os.path.exists(ruta): Verifica si una ruta (archivo o directorio) existe en el sistema.
  • os.path.isfile(ruta): Comprueba si la ruta apunta a un archivo regular.
  • os.path.isdir(ruta): Comprueba si la ruta apunta a un directroio.
import os

raiz_servidor = "/var/www/html"
recurso = "assets/css/main.css"

ruta_completa = os.path.join(raiz_servidor, recurso)
print(f"Ruta absoluta: {os.path.abspath(ruta_completa)}")

nombre_archivo = os.path.basename(ruta_completa)
directorio_padre = os.path.dirname(ruta_completa)

print(f"Archivo: {nombre_archivo}")
print(f"Carpeta contenedora: {directorio_padre}")

if os.path.exists(ruta_completa):
    print("El recurso está disponible.")
    print(f"¿Es un archivo?: {os.path.isfile(ruta_completa)}")

Inspección de Metadatos y Propiedades

Para obtener información detallada sobre el estado y las propiedades de los archivos, se utilizan funciones de inspección que devuelven marcas de tiempo y tamaños.

  • os.path.getatime(ruta): Retorna la hora del último acceso al archivo (lectura).
  • os.path.getctime(ruta): Retorna la hora de creación (o último cambio de metadatos en Unix).
  • os.path.getmtime(ruta): Retorna la hora de la última modificación del contenido.
  • os.path.getsize(ruta): Devuelve el tamaño del archivo en bytes.
  • os.stat(ruta): Proporciona un objeto con todos los atributos del archivo (permisos, inodos, tamaños, tiempos, etc.).
import os
import time

archivo_objetivo = "registro_sistema.log"

if os.path.isfile(archivo_objetivo):
    estadisticas = os.stat(archivo_objetivo)
    
    print(f"Tamaño del archivo: {estadisticas.st_size} bytes")
    
    fecha_modificacion = time.ctime(estadisticas.st_mtime)
    print(f"Modificado por última vez: {fecha_modificacion}")
    
    fecha_acceso = time.ctime(estadisticas.st_atime)
    print(f"Último acceso: {fecha_acceso}")

Constantes del Sistema y Separadores

El módulo expone variables que reflejan las convenciones del sistema operativo anfitrión, lo cual es crucial para escribir scripts multiplataforma.

  • os.sep: El separador de rutas nativo del sistema (ej. \ en Windows, / en POSIX).
  • os.linesep: La secuencia de caracteres utilizada para saltos de línea (ej. \r\n en Windows, \n en Linux).
  • os.pathsep: El separador utilizado para dividir rutas en variables de entorno como PATH (ej. ; en Windows, : en POSIX).
  • os.name: El identificador del sistema operativo (ej. nt para Windows, posix para Linux/macOS).

Ejecución de Comandos del Sistema

Python permite delegar tareas al intérprete de comandos del sistema operativo, ya sea para ejecutar acciones directas o para capturar su salida.

  • os.system(comando): Ejecuta un comando en una subshell. Devuelve el código de salida del proceso.
  • os.popen(comando): Abre una tubería hacia o desde el comando, devolviendo un objeto de archivo que permite leer la salida estándar o escribir en la entrada estándar.
import os

# Ejecución directa (la salida se imprime en la consola)
os.system("echo 'Iniciando proceso de respaldo...'")

# Captura de la salida del comando
flujo_salida = os.popen("ls -l /tmp")
resultado_comando = flujo_salida.read()

print("--- Resultado capturado ---")
print(resultado_comando)

Implementación Práctica: Explorador de Archivos Interactivo

A continuación, se presenta un script funcional que utiliza el módulo os para escanear un directorio específico, generar un menú numerado y permitir al usuario seleccionar un archivo para visualizar su contenido.

import os

def explorar_y_leer_archivos():
    # Obtener la ruta absoluta del directorio donde reside este script
    raiz_proyecto = os.path.dirname(os.path.abspath(__file__))
    carpeta_datos = os.path.join(raiz_proyecto, "documentos")

    if not os.path.isdir(carpeta_datos):
        print(f"Error: El directorio '{carpeta_datos}' no existe.")
        return

    # Filtrar solo archivos regulares
    archivos_disponibles = [
        f for f in os.listdir(carpeta_datos) 
        if os.path.isfile(os.path.join(carpeta_datos, f))
    ]

    if not archivos_disponibles:
        print("No se encontraron archivos en el directorio especificado.")
        return

    # Construir menú dinámico
    menu_opciones = {i + 1: nombre for i, nombre in enumerate(archivos_disponibles)}

    print("\n=== Archivos Disponibles ===")
    for clave, valor in menu_opciones.items():
        print(f"[{clave}] {valor}")
    print("============================")

    try:
        seleccion = int(input("\nSeleccione el número del archivo a leer: "))
        
        if seleccion in menu_opciones:
            ruta_objetivo = os.path.join(carpeta_datos, menu_opciones[seleccion])
            
            with open(ruta_objetivo, "r", encoding="utf-8") as archivo:
                contenido = archivo.read()
                print("\n--- Inicio del Contenido ---")
                print(contenido)
                print("--- Fin del Contenido ---\n")
        else:
            print("El número seleccionado no es válido.")
            
    except ValueError:
        print("Entrada inválida. Por favor, ingrese un número entero.")
    except Exception as e:
        print(f"Ocurrió un error al leer el archivo: {e}")

if __name__ == "__main__":
    explorar_y_leer_archivos()

Etiquetas: Python os-module file-system path-manipulation system-commands

Publicado el 6-22 21:31