Bucle creativo

Capítulo 2: Dejando Huella - Escribir y Agregar Información

🎯 Objetivo de aprendizaje

Dominar los modos de escritura ("w") y adición ("a") en Python para crear archivos desde cero o agregar datos de forma segura, desarrollando la competencia técnica para construir sistemas de registro persistentes, fomentando el pensamiento crítico ante la pérdida de información y cultivando una actitud ética y cuidadosa hacia los datos, entendiendo que cada línea escrita es una huella digital que construye memoria y conecta con la realidad de quienes la leerán.

💡 Activación: Tu primer encuentro con la huella

Imagina que estás organizando el Inti Raymi en tu comunidad. La fiesta del sol está por comenzar, el ambiente huele a chicha y a tierra mojada, y cientos de personas llegan con el corazón lleno de alegría. Quieres que cada asistente deje un mensaje, un deseo, una oración al sol, para que quede guardado para siempre.

¿Cómo lo harías? Si usas una pizarra, cada vez que alguien escribe, lo anterior se borra. Pero si usas un gran libro de visitas, cada mensaje se suma al anterior, creando una historia colectiva.

Hoy, tu programa en Python dejará de ser solo un lector de historias: se convertirá en el autor que las escribe y las guarda para la eternidad. Pasarás de observar los datos a dejar tu propia huella. Del lector al escritor: ahora Python deja su marca.

📚 Desarrollo: Los modos de escritura

✍️ ¿Sobrescribir o agregar? Esa es la cuestión

Imagina que tienes un cuaderno con anotaciones importantes. Cuando quieres escribir algo nuevo, tienes dos opciones:

  1. Borrar todo y empezar de nuevo (modo "w" - write).
  2. Agregar al final, sin tocar lo anterior (modo "a" - append).
Modo Símbolo ¿Qué hace? ¿Cuándo usarlo?
"w" ✏️ Borra todo y escribe desde cero Cuando quieres crear un archivo nuevo o reemplazar completamente uno existente
"a" Agrega al final sin borrar nada Cuando quieres añadir información a un archivo que ya existe
🚨 ADVERTENCIA CRÍTICA: Si usas "w" en un archivo que ya tiene datos, TODO SE BORRA. Sin confirmación. Sin papelera. Desaparece. Siempre verifica qué modo estás usando.

🐍 Tu primera escritura: write()

La función write() es el complemento de read(). Veamos cómo funciona:

# Crear un archivo nuevo con un mensaje
with open("saludo.txt", "w") as archivo:
    archivo.write("¡Hola, Ecuador!\n")
    archivo.write("Este es mi primer archivo escrito desde Python.\n")
💡 Tip importante: A diferencia de print(), la función write() NO agrega saltos de línea automáticamente. Si quieres que cada texto esté en una línea distinta, debes agregar \n manualmente.

🔄 El peligro del modo "w": Sobrescribir sin querer

Ahora prueba esto:

# Primer archivo
with open("saludo.txt", "w") as archivo:
    archivo.write("Primer mensaje\n")

# Segundo archivo (¡mismo nombre!)
with open("saludo.txt", "w") as archivo:
    archivo.write("Segundo mensaje\n")

¿Qué crees que contiene saludo.txt ahora? Solo esto: Segundo mensaje. El "Primer mensaje" desapareció completamente. El modo "w" borra todo antes de escribir.

🎯 Regla de oro: Solo usa "w" cuando estés seguro de que quieres reemplazar el contenido completo, o cuando estés creando un archivo nuevo que no existe todavía.

➕ El modo seguro: Agregar con "a"

Si quieres conservar lo que ya está en el archivo y solo añadir más información al final, usa el modo "a" (append):

# Agregar una línea al final
with open("saludo.txt", "a") as archivo:
    archivo.write("Tercer mensaje\n")

El "Segundo mensaje" se conservó, y el "Tercer mensaje" se agregó al final.

🎓 Analogía:
  • "w" es como usar una pizarra: borras todo y escribes de nuevo.
  • "a" es como usar un cuaderno: escribes en la siguiente página sin borrar lo anterior.

🎯 Manos a la obra: El Libro de Visitas del Inti Raymi

Vamos a construir algo real y significativo. El Inti Raymi es la fiesta del sol, una de las celebraciones más importantes de los pueblos andinos del Ecuador. Imagina que estás organizando la fiesta en tu comunidad y quieres un Libro de Visitas Digital donde cada asistente pueda dejar un mensaje.

Paso 1: El código completo

# libro_visitas.py - Libro de Visitas Digital del Inti Raymi
print(" 🌞 ¡Bienvenido al Libro de Visitas del Inti Raymi! 🌞")
print("Deja tu mensaje para que quede registrado en la historia.\n")

# Pedimos los datos al usuario
nombre = input("¿Cuál es tu nombre? ").strip()
mensaje = input("Escribe tu mensaje: ").strip()

# Validación básica
if not nombre or not mensaje:
    print(" ❌ Por favor, ingresa tu nombre y un mensaje.")
else:
    # Agregamos la visita al archivo
    with open("visitantes.txt", "a") as archivo:
        archivo.write(f"{nombre}: {mensaje}\n")
    
    print(f"\n ✅ ¡Gracias, {nombre}! Tu mensaje ha sido guardado en el libro de visitas.")
    print(" 🌾 Que la energía del Inti Raymi te acompañe. 🌾")

Paso 2: Pruébalo varias veces. Ejecuta el programa, ingresa tu nombre y un mensaje. Luego ejecútalo otra vez con otro nombre. Revisa el archivo visitantes.txt y verás que cada ejecución agregó una línea nueva sin borrar las anteriores. ¡Eso es el modo "a" en acción!

📅 Versión mejorada: Agregando fecha y hora

Un libro de visitas real incluye cuándo se escribió cada mensaje. Vamos a mejorarlo usando el módulo datetime:

# libro_visitas_avanzado.py - Con fecha y hora
from datetime import datetime

print(" 🌞 ¡Bienvenido al Libro de Visitas del Inti Raymi! 🌞 \n")

nombre = input("¿Cuál es tu nombre? ").strip()
mensaje = input("Escribe tu mensaje: ").strip()

if not nombre or not mensaje:
    print(" ❌ Por favor, ingresa tu nombre y un mensaje.")
else:
    # Obtenemos la fecha y hora actual
    fecha_hora = datetime.now().strftime("%d/%m/%Y %H:%M")
    
    # Formato: [fecha] nombre: mensaje
    linea = f"[{fecha_hora}] {nombre}: {mensaje}\n"
    
    with open("visitantes.txt", "a") as archivo:
        archivo.write(linea)
    
    print(f"\n ✅ ¡Gracias, {nombre}! Tu mensaje ha sido guardado.")
    print(f" 📅 Registrado el {fecha_hora}")
💡 ¿Qué hace strftime? Convierte la fecha y hora en un texto con el formato que tú quieras: %d (día), %m (mes), %Y (año completo), %H (hora en 24h), %M (minutos).

🗑️ Bonus: Permitir borrar el último mensaje

A veces el usuario se equivoca y quiere borrar su último mensaje. Vamos a agregar esa funcionalidad con un menú interactivo:

# libro_visitas_completo.py - Con opción de borrar el último
from datetime import datetime

def agregar_visita():
    print("\n 🌞 ¡Bienvenido al Libro de Visitas del Inti Raymi! 🌞 \n")
    
    nombre = input("¿Cuál es tu nombre? ").strip()
    mensaje = input("Escribe tu mensaje: ").strip()
    
    if not nombre or not mensaje:
        print(" ❌ Por favor, ingresa tu nombre y un mensaje.")
        return
    
    fecha_hora = datetime.now().strftime("%d/%m/%Y %H:%M")
    linea = f"[{fecha_hora}] {nombre}: {mensaje}\n"
    
    with open("visitantes.txt", "a") as archivo:
        archivo.write(linea)
    
    print(f"\n ✅ ¡Gracias, {nombre}! Tu mensaje ha sido guardado.")

def borrar_ultimo():
    try:
        # Leer todas las líneas
        with open("visitantes.txt", "r") as archivo:
            lineas = archivo.readlines()
        
        if not lineas:
            print(" ⚠️ El libro de visitas está vacío.")
            return
        
        # Mostrar el último mensaje
        ultimo = lineas[-1].strip()
        print(f"\n 📝 Último mensaje: {ultimo}")
        
        confirmar = input("¿Estás seguro de borrarlo? (s/n): ").strip().lower()
        
        if confirmar == "s":
            # Reescribir todo excepto la última línea
            with open("visitantes.txt", "w") as archivo:
                archivo.writelines(lineas[:-1])
            print(" ✅ Último mensaje borrado.")
        else:
            print(" ❌ Operación cancelada.")
    
    except FileNotFoundError:
        print(" ⚠️ El libro de visitas aún no existe.")

# Menú principal
while True:
    print("\n" + "=" * 50)
    print(" 🌞 LIBRO DE VISITAS DEL INTI RAYMI 🌞")
    print("=" * 50)
    print("1. Dejar un mensaje")
    print("2. Borrar el último mensaje")
    print("3. Salir")
    
    opcion = input("\nElige una opción (1-3): ").strip()
    
    if opcion == "1":
        agregar_visita()
    elif opcion == "2":
        borrar_ultimo()
    elif opcion == "3":
        print("\n 🌾 ¡Hasta pronto! Que el sol te acompañe. 🌾")
        break
    else:
        print(" ❌ Opción no válida. Intenta de nuevo.")

🔍 ¿Qué hace borrar_ultimo()?

  1. Lee todas las líneas del archivo con readlines().
  2. Muestra la última línea (lineas[-1]).
  3. Si el usuario confirma, reescribe el archivo sin la última línea (lineas[:-1]).
  4. Usa modo "w" porque necesita reemplazar todo el contenido.

🎯 Nota: Aquí sí usamos "w" porque queremos reescribir completamente el archivo, pero con una línea menos.

🛡️ Manejo de errores al escribir

¿Qué puede salir mal al escribir archivos?

Error ¿Cuándo ocurre? Solución
PermissionError No tienes permisos para escribir en esa carpeta Cambia la ubicación o ejecuta como administrador
FileNotFoundError Intentas leer un archivo que no existe Usa "a" para crearlo, o verifica la ruta
IsADirectoryError Intentas abrir una carpeta como si fuera un archivo Verifica que el nombre incluya la extensión (.txt)

Ejemplo con manejo de errores:

try:
    with open("visitantes.txt", "a") as archivo:
        archivo.write("Nuevo mensaje\n")
    print(" ✅ Archivo escrito correctamente.")
except PermissionError:
    print(" ❌ No tengo permisos para escribir en esta carpeta.")
except Exception as e:
    print(f" ❌ Error inesperado: {e}")
✅ Checkpoint de aprendizaje: Antes de pasar al próximo nivel, pregúntate:
  • ¿Entiendo la diferencia entre los modos "w" y "a"?
  • ¿Sé que "w" borra todo el contenido anterior?
  • ¿Puedo crear un archivo nuevo con open("nombre.txt", "w")?
  • ¿Puedo agregar información al final con open("nombre.txt", "a")?
  • ¿Recuerdo agregar \n al final de cada write() para saltar de línea?
  • ¿Puedo usar datetime para agregar fecha y hora a mis registros?
🚀 Vista previa del próximo capítulo: En el Capítulo 3 daremos un salto gigante: dejaremos atrás los archivos de texto plano y entraremos al mundo de los datos estructurados con archivos CSV. Aprenderás a manejar información en filas y columnas, como una hoja de cálculo. Esto es el puente directo hacia las bases de datos relacionales.

📝 Tarea opcional: Piensa en un negocio real (puede ser ficticio) que te gustaría administrar: una tienda, un café, una librería, un taller mecánico. En el próximo capítulo lo usaremos como caso de estudio.

🚀 Reto: Elige tu camino

Ahora que dominas la escritura de archivos, elige el reto que más te motive. El Diseño Universal para el Aprendizaje (DUA) nos dice que todos aprendemos de formas distintas. ¡Encuentra la tuya!

🎨 Reto visual (para los creativos)

Crea un programa que genere un archivo de texto con arte ASCII. Por ejemplo, un mapa del Ecuador hecho con caracteres. Guarda el resultado en un archivo mapa_ecuador.txt.

🔢 Reto lógico (para los analíticos)

Crea un "Contador de Visitas" que lea cuántas líneas tiene visitantes.txt, muestre "Han visitado el libro X personas", y si el archivo no existe, muestre "Aún no hay visitas".

🌎 Reto de expansión (para los emprendedores)

Transforma el libro de visitas en un sistema de registro para un negocio real: una tienda de artesanías que registre cada venta, un gimnasio que registre la asistencia, o un restaurante que registre reservas. Adapta el código y agrégale campos relevantes.

🗣️ Reto de accesibilidad (para los empáticos)

Mejora el menú del programa para que sea más accesible: agrega la opción "4. Ver todos los mensajes" que muestre el libro completo, y "5. Buscar mensajes por nombre" que filtre las visitas de una persona específica.

🎮 Evaluación lúdica: Pon a prueba lo aprendido

Responde las siguientes preguntas para demostrar lo que has aprendido. ¡Recuerda que cada error es una oportunidad para reflexionar y crecer!

⭐ Puntaje: 0/5