🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

¡Domina la manipulación de archivos y directorios con el módulo os de Python!

Para ejecutar Python desde el símbolo del sistema o PowerShell en tu PC, necesitas descargar e instalar Python.
Si aún no lo has hecho, consulta el artículo Instalación de Python y configuración del entorno de desarrollo para instalar Python.

Cuando administras un sitio web, a menudo necesitas manipular archivos en el servidor, como organizar imágenes subidas o hacer copias de seguridad periódicas, ¿verdad? Es en esos momentos cuando el módulo os de Python es de gran ayuda.

El módulo os es una biblioteca estándar de Python para interactuar con las funciones del sistema operativo (OS), especialmente para manipular el sistema de archivos. Con él, puedes automatizar desde un programa tareas que normalmente realizas con el ratón o la línea de comandos, como crear, eliminar y renombrar archivos y directorios.

En este artículo, presentaremos muchos códigos listos para copiar y pegar, desde el uso básico del módulo os hasta ejemplos prácticos, para que los creadores web como tú puedan usarlos de inmediato cuando piensen "quiero automatizar una pequeña tarea". ¡Dejemos la teoría complicada para después y experimentemos primero la alegría de hacer que las cosas funcionen! 🚀


Uso básico del módulo os

Primero, lo fundamental. Veamos la preparación para usar el módulo os y sus funciones básicas más utilizadas. Cualquier operación compleja se compone de una combinación de estos conceptos básicos.

1. Importar el módulo os

Para usar el módulo os, primero debes importarlo (cargarlo) al principio de tu script de Python. Es como un conjuro mágico, ¿no crees?

import os

2. Verificar el directorio de trabajo actual - getcwd()

Saber dónde se está ejecutando actualmente tu programa (el directorio de trabajo actual) es fundamental para cualquier operación. Puedes verificarlo usando `os.getcwd()`. (getcwd es la abreviatura de get current working directory).

import os

# Obtener y mostrar el directorio de trabajo actual
current_path = os.getcwd()
print(f"Directorio actual: {current_path}")

# Ejemplo de salida:
# Directorio actual: /Users/yourname/Documents

3. Crear un directorio - mkdir(), makedirs()

Vamos a crear una nueva carpeta (directorio). `os.mkdir()` crea un solo directorio. Si quieres crear una jerarquía profunda de directorios de una sola vez, `os.makedirs()` es muy útil.

Primero, un ejemplo creando solo uno con `mkdir()`.

import os

# Crear un directorio llamado "my_project"
# Asegúrate de que no exista un directorio con el mismo nombre antes de ejecutar
if not os.path.exists("my_project"):
    os.mkdir("my_project")
    print("Directorio 'my_project' creado.")
else:
    print("El directorio 'my_project' ya existe.")

A continuación, con `makedirs()` crearemos directorios con una relación padre-hijo, como `parent/child`, de una sola vez. Añadir `exist_ok=True` es una buena práctica, ya que evita errores si el directorio ya existe.

import os

# Crear una jerarquía de directorios "contents/images" de una vez
# Como exist_ok=True, no dará error si el directorio ya existe al ejecutar
os.makedirs("contents/images", exist_ok=True)
print("Directorio 'contents/images' creado (o ya existía).")

4. Obtener una lista de archivos y directorios - listdir()

Si quieres saber qué archivos y carpetas hay dentro de un directorio específico, usa `os.listdir()`. Si no especificas una ruta como argumento, devuelve una lista del directorio de trabajo actual.

import os

# Obtener la lista de archivos y directorios del directorio actual
# Si has creado "my_project" o "contents" previamente, aparecerán en la lista
items = os.listdir('.') # '.' se refiere al directorio actual
print(f"Contenido del directorio actual: {items}")

# Ejemplo de salida:
# Contenido del directorio actual: ['my_project', 'contents', 'my_script.py']

5. Unir rutas de forma segura - path.join()

¡Concatenar cadenas de ruta por tu cuenta como `"folder" + "/" + "file.txt"` es peligroso! Esto se debe a que el separador de rutas varía según el sistema operativo (Windows usa `\`, mientras que Mac y Linux usan `/`). `os.path.join()` es muy seguro porque une las rutas con el separador adecuado para el sistema operativo en el que se está ejecutando.

import os

# Unión de rutas segura e independiente del SO
dir_name = "assets"
file_name = "style.css"

# Este código funciona correctamente en Windows, Mac y Linux
correct_path = os.path.join(dir_name, "css", file_name)
print(f"Ruta generada: {correct_path}")

# Ejemplo de salida (Mac/Linux):
# Ruta generada: assets/css/style.css

# Ejemplo de salida (Windows):
# Ruta generada: assets\css\style.css

6. Cambiar el nombre / Mover un archivo o directorio - rename()

`os.rename()` no solo sirve para cambiar el nombre de un archivo o directorio, sino también para moverlo. Si especificas un directorio diferente como destino, puedes moverlo allí.

import os

# Crear un archivo de prueba llamado "old_name.txt"
with open("old_name.txt", "w") as f:
    f.write("test")

# Renombrar "old_name.txt" a "new_name.txt"
if os.path.exists("old_name.txt"):
    os.rename("old_name.txt", "new_name.txt")
    print("Se ha cambiado el nombre de old_name.txt a new_name.txt.")

# Confirmación
print(f"Contenido del directorio actual: {os.listdir('.')}")

7. Eliminar un archivo o directorio - remove(), rmdir()

Eliminar archivos y directorios también es fácil. Usa `os.remove()` para eliminar un archivo y `os.rmdir()` para eliminar un directorio vacío. Ten cuidado, ya que `rmdir()` no puede eliminar un directorio que contenga archivos.

import os

# Crear un archivo de prueba llamado "temp_file.txt"
with open("temp_file.txt", "w") as f:
    f.write("delete me")

# Crear un directorio de prueba llamado "temp_dir"
if not os.path.exists("temp_dir"):
    os.mkdir("temp_dir")

# Eliminar el archivo
if os.path.exists("temp_file.txt"):
    os.remove("temp_file.txt")
    print("Se ha eliminado temp_file.txt.")

# Eliminar el directorio vacío
if os.path.exists("temp_dir"):
    os.rmdir("temp_dir")
    print("Se ha eliminado temp_dir.")

【Práctica】¡Usemos el módulo os!

Ahora que entiendes lo básico, veamos un código más práctico. Estos ejemplos podrían facilitar un poco tus tareas diarias.

Ejemplo de aplicación 1: Organizar múltiples archivos de imagen por extensión

¿Tu carpeta de descargas o de recursos está llena de archivos de imagen como JPG, PNG y SVG mezclados? Este es un script que los clasifica automáticamente en carpetas según su extensión.

import os

# --- Preparación: Crear archivos de prueba para organizar ---
# Crear un directorio de trabajo llamado "image_sorter"
base_dir = "image_sorter"
os.makedirs(base_dir, exist_ok=True)

# Crear archivos de imagen de prueba
dummy_files = ["cat.jpg", "dog.png", "logo.svg", "photo.jpg", "icon.png"]
for fname in dummy_files:
    # Generar la ruta de forma segura usando os.path.join
    with open(os.path.join(base_dir, fname), "w") as f:
        f.write(f"This is {fname}.")

print(f"Contenido de {base_dir} antes de organizar: {os.listdir(base_dir)}")
print("-" * 20)
# --- Fin de la preparación ---


# --- Proceso principal: Organizar los archivos ---
# Especificar el directorio a organizar
target_dir = "image_sorter"

# Obtener todos los archivos del directorio
for filename in os.listdir(target_dir):
    # Generar la ruta completa del archivo
    full_path = os.path.join(target_dir, filename)

    # Si no es un archivo (es decir, es un directorio), saltarlo
    if not os.path.isfile(full_path):
        continue

    # Obtener la extensión del nombre del archivo (ej: ".jpg")
    # os.path.splitext es una función útil que divide el nombre y la extensión
    ext = os.path.splitext(filename)[1] # Obtener el segundo elemento de ("cat", ".jpg")

    # Saltar archivos sin extensión
    if not ext:
        continue

    # Crear una carpeta con el nombre de la extensión sin el "." (ej: carpeta "jpg")
    # Convertir la extensión a minúsculas para unificar
    folder_name = ext[1:].lower()
    ext_dir = os.path.join(target_dir, folder_name)

    # Si la carpeta no existe, crearla
    os.makedirs(ext_dir, exist_ok=True)

    # Mover el archivo a la nueva carpeta
    new_path = os.path.join(ext_dir, filename)
    os.rename(full_path, new_path)
    print(f"Se movió {filename} a la carpeta {folder_name}.")

print("-" * 20)
print(f"Contenido de {base_dir} después de organizar: {os.listdir(base_dir)}")
print(f"Contenido de la carpeta jpg: {os.listdir(os.path.join(base_dir, 'jpg'))}")
print(f"Contenido de la carpeta png: {os.listdir(os.path.join(base_dir, 'png'))}")

【Totalmente Copiable】Código para generar un entorno de prueba en tu escritorio

Después de leer hasta aquí, algunos podrían preguntarse: "Quiero probar esto en mi PC, pero ¿dónde debo ejecutarlo?". Por eso, hemos preparado un código de Python "listo para funcionar" que puedes simplemente copiar, guardar con un nombre como `create_test_env.py` y ejecutar para generar automáticamente una carpeta y archivos de prueba en el escritorio de tu PC. ¡Comprueba tu escritorio después de ejecutarlo!

(※Este código crea una carpeta llamada `python_os_test` en tu escritorio. Por favor, elimina la carpeta cuando ya no la necesites.)

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Ejemplo de código del módulo os de Python</title>
    <style>
        body { background-color: #202124; color: #e8eaed; font-family: sans-serif; }
        pre { background-color: #282c34; color: #abb2bf; padding: 1em; border-radius: 5px; overflow-x: auto; }
        code { font-family: 'Courier New', Courier, monospace; }
        h1 { color: #669df6; }
        p { line-height: 1.6; }
    </style>
</head>
<body>
    <h1>Código Python: Generar un entorno de prueba en el escritorio</h1>
    <p>Copia el siguiente código Python, guárdalo como `create_test_env.py` y ejecútalo desde tu terminal o símbolo del sistema con `python create_test_env.py`.</p>
<pre><code>
import os
import sys

def create_test_environment():
    """
    Función para generar directorios y archivos de prueba en el escritorio.
    """
    try:
        # 1. Obtener la ruta del escritorio
        # os.path.expanduser('~') obtiene el directorio de inicio del usuario
        desktop_path = os.path.join(os.path.expanduser('~'), 'Desktop')

        # Para entornos de SO sin escritorio (como un servidor CUI), usar el directorio actual
        if not os.path.exists(desktop_path):
            desktop_path = os.getcwd()
            print(f"Escritorio no encontrado. Se creará en el directorio actual: {desktop_path}")

        # 2. Crear la carpeta de prueba principal
        main_test_dir = os.path.join(desktop_path, "python_os_test")
        os.makedirs(main_test_dir, exist_ok=True)
        print(f"Carpeta principal creada: {main_test_dir}")

        # 3. Crear subcarpetas
        sub_dirs = ["documents", "images", "archives"]
        for sub_dir in sub_dirs:
            os.makedirs(os.path.join(main_test_dir, sub_dir), exist_ok=True)

        print(f"Subcarpetas creadas: {sub_dirs}")

        # 4. Crear archivos de prueba
        files_to_create = {
            "documents": ["report.txt", "memo.md"],
            "images": ["cat.jpg", "dog.png"],
            "": ["readme.txt"] # Directamente en la carpeta principal
        }

        for directory, filenames in files_to_create.items():
            for filename in filenames:
                file_path = os.path.join(main_test_dir, directory, filename)
                with open(file_path, "w", encoding="utf-8") as f:
                    f.write(f"Este es el contenido de prueba para {filename}.")

        print("Archivos de prueba creados.")
        print("\n")
        print("🎉 ¡Configuración completada!")
        print(f"Por favor, revisa el directorio {main_test_dir}.")

    except OSError as e:
        print(f"Ocurrió un error: {e}", file=sys.stderr)
        print("Podría ser un problema de permisos o un problema con la ruta.", file=sys.stderr)
    except Exception as e:
        print(f"Ocurrió un error inesperado: {e}", file=sys.stderr)

if __name__ == "__main__":
    create_test_environment()
</code></pre>
</body>
</html>

3 puntos clave a tener en cuenta

El módulo os es potente, pero como manipula directamente el sistema de archivos, hay algunos puntos a tener en cuenta. Solo con conocerlos puedes prevenir muchos errores.

  1. Especificación de ruta incorrecta
    La mayoría de los errores "No such file or directory" (FileNotFoundError) son causados por una especificación de ruta incorrecta. Acostúmbrate a verificar tu ubicación actual con `os.getcwd()` y a comprobar previamente la existencia de tu objetivo con `os.path.exists()`.
  2. No omitir el manejo de errores
    Intentar crear un directorio existente con `os.mkdir()` o eliminar un archivo inexistente con `os.remove()` hará que tu programa se detenga con un error. Escribir tu código para manejar posibles errores usando comprobaciones previas con `os.path.exists()` o bloques `try...except` dará como resultado un programa más robusto.
  3. Operaciones irreversibles
    Operaciones como `os.remove()` y `os.rename()` generalmente no se pueden "deshacer". No pasan por la papelera de reciclaje del PC. Especialmente cuando se trata de archivos importantes, es más seguro añadir un paso intermedio, como moverlos primero a una carpeta de respaldo, en lugar de eliminarlos directamente.

¡Aún más conveniente! Introducción a módulos relacionados

El módulo os es fundamental, pero también existen bibliotecas más modernas y convenientes. Como siguiente paso, es una buena idea familiarizarse también con estas bibliotecas.

pathlib - Manipulación de rutas moderna e intuitiva

`pathlib`, añadido a la biblioteca estándar en Python 3.4, es un módulo que te permite tratar las rutas como objetos de una manera intuitiva. Como son objetos en lugar de cadenas, puedes encadenar métodos, unir rutas con el operador `/` y, en general, escribir un código más limpio.

from pathlib import Path

# Obtener el directorio actual como un objeto Path
p = Path('.')

# Creación de directorio usando pathlib
new_dir = p / "pathlib_test" # ¡Puedes unir rutas con el operador /!
new_dir.mkdir(exist_ok=True) # Ejecutar como un método

# Listar archivos también es fácil
for item in p.iterdir():
    print(f"{'Directorio' if item.is_dir() else 'Archivo'}: {item.name}")

shutil - Operaciones de archivo de alto nivel

`shutil` (utilidades de shell) proporciona operaciones de archivo de más alto nivel que el módulo os. Por ejemplo, copiar o eliminar un directorio con su contenido, lo que requeriría que escribieras una función recursiva tú mismo con el módulo os, se puede hacer en una sola línea con `shutil`.

import shutil
import os

# --- Preparación ---
os.makedirs("source_dir/sub_dir", exist_ok=True)
with open("source_dir/sub_dir/data.txt", "w") as f:
    f.write("important data")

# --- Ejemplo de uso de shutil ---

# Copiar un directorio entero
if os.path.exists("source_dir"):
    shutil.copytree("source_dir", "backup_dir")
    print("Se ha copiado source_dir a backup_dir.")

# Eliminar un directorio y su contenido
if os.path.exists("backup_dir"):
    shutil.rmtree("backup_dir")
    print("Se ha eliminado backup_dir y su contenido.")

# Eliminar también el source_dir que ya no es necesario
shutil.rmtree("source_dir")

Conclusión

En este artículo, hemos cubierto desde los conceptos básicos hasta ejemplos de aplicación de la manipulación de archivos y directorios usando el módulo os de Python. Detrás del desarrollo web, ocurren muchas de estas tediosas operaciones de archivo. Al dominar el módulo os, deberías poder automatizar estas molestas tareas manuales y concentrarte más en tu trabajo creativo.

Primero, intenta copiar y pegar el código de este artículo para tener la sensación de "¡hacer que los archivos se muevan con un programa!". A partir de ahí, ¡intenta personalizarlo para que se ajuste a tus propias necesidades laborales!

Hacia el siguiente paso

Después de la manipulación de archivos, ¿por qué no explorar el mundo de la computación numérica? Con el módulo math de Python, puedes realizar fácilmente diversos cálculos matemáticos, como funciones trigonométricas y logaritmos.

➡️ Domina las funciones matemáticas con el módulo math