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\nen Windows,\nen Linux).os.pathsep: El separador utilizado para dividir rutas en variables de entorno comoPATH(ej.;en Windows,:en POSIX).os.name: El identificador del sistema operativo (ej.ntpara Windows,posixpara 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()