Bucle Creativo

Despertando la Memoria: Leer lo que ya existe

Capítulo 1: Archivos y persistencia de datos en Python

🎯 Objetivo de aprendizaje

Comprender la diferencia entre la memoria temporal (RAM) y el almacenamiento permanente (disco duro), y desarrollar la capacidad de abrir, leer y procesar archivos de texto de forma segura en Python, integrando competencias técnicas que permitan manipular datos persistentes, habilidades cognitivas para analizar estructuras de información y actitudes de responsabilidad y cuidado en el manejo de recursos del sistema, construyendo programas que puedan "recordar" información entre sesiones de ejecución.

💡 Activación: Tu primer encuentro con la memoria

Imagina que estás estudiando para un examen de Historia del Ecuador. Tienes tu libro abierto, tus apuntes resaltados, y toda la información que necesitas frente a ti. Es rápido, es cómodo, puedes acceder a todo en segundos. Pero entonces... se va la luz. O decides irte a dormir. Y cuando vuelves, todo ha desaparecido. Tu mesa está vacía.

Esto es exactamente lo que le pasa a tu computadora con las variables. Todo lo que guardas en memoria RAM (la memoria de trabajo) se borra cuando cierras el programa. Es como estudiar solo con lo que tienes en la mesa: rápido, pero efímero.

💭 Reflexión DUA: Piensa en la última vez que perdiste un trabajo porque se fue la luz o cerraste el programa sin guardar. Esa frustración, ese momento de "¡no puede ser!", es exactamente lo que vamos a evitar aprendiendo a usar archivos. Porque los archivos son tu librero, tu cuaderno guardado, tu memoria a largo plazo.

Tu computadora funciona con dos tipos de memoria, igual que tú:

Memoria En tu computadora En Python ¿Qué pasa al cerrar?
Corto plazo RAM (memoria viva) Variables (nombre = "Ana") Se borra todo 😱
Largo plazo Disco duro / SSD Archivos (datos.txt) Se conserva ✅

📚 Desarrollo: Los archivos y cómo leerlos

📁 ¿Qué es un archivo, realmente?

Un archivo es simplemente una secuencia de bytes guardada en el disco con un nombre y una ubicación (ruta). Cuando es de texto, esos bytes representan letras, números y símbolos que puedes leer.

📮 La analogía de la dirección postal:

Para que el cartero entregue una carta, necesita saber exactamente dónde dejarla:

  • País → Ecuador
  • Provincia → Pichincha
  • Ciudad → Quito
  • Calle → Av. Amazonas N36-125
  • Destinatario → Juan Pérez

En Python, para encontrar un archivo necesitas algo similar, llamado ruta:

C:\\Users\\Juan\\Documents\\provincias.txt      (Windows)
/Users/Juan/Documents/provincias.txt        (Mac/Linux)

🔍 Tip pedagógico: Si no sabes qué ruta usar, guarda tus archivos en la misma carpeta donde está tu script de Python. Así solo escribes el nombre: "provincias.txt". Simple.

🐍 Tu primera función: open()

Python tiene una función nativa llamada open() que es como pedirle al sistema operativo que te preste un archivo. Su forma más básica es:

archivo = open("provincias.txt", "r")

Desglosemos los dos argumentos:

Argumento Significado Ejemplo
Nombre del archivo Cómo se llama (con su extensión) "provincias.txt"
Modo Qué quieres hacer con él "r" = read (leer)

Los modos más comunes (por ahora solo necesitas uno):

Modo Nombre ¿Para qué sirve?
"r" read Leer (el que usaremos hoy)
"w" write Escribir (sobrescribe) — lo veremos en el Cap. 2
"a" append Agregar al final — lo veremos en el Cap. 2

📖 Tres formas de leer un archivo

Una vez abierto, tienes tres métodos principales para sacar la información. Probémoslos.

Primero, crea el archivo de ejemplo:

Abre tu editor de código (VS Code, Thonny, PyCharm...) y crea un archivo nuevo llamado provincias.txt en la misma carpeta de tu script. Copia este contenido:

Pichincha,Quito
Guayas,Guayaquil
Azuay,Cuenca
Manabí,Portoviejo
Tungurahua,Ambato
Imbabura,Ibarra
Loja,Loja
El Oro,Machala

✅ Guarda ambos archivos en la misma carpeta. Esto es clave para que funcione.

Método 1: read() — Todo de un tirón

archivo = open("provincias.txt", "r")
contenido = archivo.read()
print(contenido)
archivo.close()

Salida:

Pichincha,Quito
Guayas,Guayaquil
Azuay,Cuenca
...

📌 read() devuelve todo el contenido como un solo texto gigante.

Método 2: readline() — Línea por línea

archivo = open("provincias.txt", "r")
print(archivo.readline())  # Primera línea
print(archivo.readline())  # Segunda línea
archivo.close()

📌 Cada llamada avanza el "cursor" una línea. Útil cuando solo necesitas las primeras líneas.

Método 3: readlines() — Todas las líneas en una lista

archivo = open("provincias.txt", "r")
lineas = archivo.readlines()
print(lineas)
archivo.close()

Salida:

['Pichincha,Quito\\n', 'Guayas,Guayaquil\\n', 'Azuay,Cuenca\\n', ...]

📌 Devuelve una lista, donde cada elemento es una línea. Ideal para recorrer con un for.

🎯 Manos a la obra: El buscador de provincias

Vamos a construir un programa real. El usuario escribirá el nombre de una provincia y el programa le dirá su capital.

Paso 1: El código completo

Crea un archivo llamado buscador.py y escribe:

# buscador.py - Encuentra la capital de cualquier provincia ecuatoriana

# 1. Abrimos el archivo en modo lectura
archivo = open("provincias.txt", "r")

# 2. Leemos todas las líneas y las guardamos en una lista
lineas = archivo.readlines()

# 3. Cerramos el archivo (¡muy importante!)
archivo.close()

# 4. Pedimos al usuario qué provincia busca
provincia_buscada = input("¿De qué provincia quieres saber la capital? ").strip()

# 5. Buscamos la provincia en cada línea
encontrada = False
for linea in lineas:
    # Eliminamos el salto de línea al final y separamos por coma
    partes = linea.strip().split(",")
    provincia = partes[0]
    capital = partes[1]
    
    # Comparamos (ignorando mayúsculas/minúsculas)
    if provincia.lower() == provincia_buscada.lower():
        print(f"✅ La capital de {provincia} es {capital}.")
        encontrada = True
        break  # Salimos del bucle, ya encontramos lo que buscábamos

# 6. Si recorrimos todo y no encontramos nada...
if not encontrada:
    print(f"❌ No encontré la provincia '{provincia_buscada}'. ¿La escribiste bien?")

Paso 2: Ejecútalo y pruébalo

Abre la terminal en la carpeta de tu proyecto y ejecuta:

python buscador.py

Prueba con: Azuay, guayas (en minúsculas), Loja, y también con una que no exista como Atlántida.

🔍 Entendiendo el código línea por línea

Analicemos las partes clave, porque aquí está la magia:

linea.strip().split(",")

Esta línea hace dos cosas a la vez (de adentro hacia afuera):

  1. strip(): Elimina espacios y el salto de línea (\\n) al final.
  2. split(","): Corta el texto donde haya una coma y devuelve una lista.
"Pichincha,Quito\\n"
        ↓ strip()
"Pichincha,Quito"
        ↓ split(",")
["Pichincha", "Quito"]

provincia.lower() == provincia_buscada.lower()

Convierte ambas cadenas a minúsculas antes de comparar. Así "GUAYAS", "guayas" y "Guayas" son tratadas como iguales. Es una buena práctica para hacer tu programa más amigable.

break

Detiene el bucle for en cuanto encuentra la respuesta. Si no lo pusiéramos, seguiría buscando en las líneas restantes, gastando tiempo inútilmente.

🛡️ La forma profesional de abrir archivos: with

Hay un detalle importante: en los ejemplos anteriores usamos archivo.close() al final. Pero... ¿qué pasa si el programa falla antes de llegar ahí? El archivo queda abierto, ocupando recursos.

Python tiene una forma más elegante y segura llamada gestor de contexto:

with open("provincias.txt", "r") as archivo:
    lineas = archivo.readlines()
# Aquí el archivo se cierra SOLO, pase lo que pase

🎓 Analogía: Es como pedir un libro en la biblioteca con un sistema automático de devolución. No importa si te distraes o te vas corriendo: el libro vuelve a su lugar.

Versión mejorada del buscador:

provincia_buscada = input("¿De qué provincia quieres saber la capital? ").strip()

with open("provincias.txt", "r") as archivo:
    lineas = archivo.readlines()

encontrada = False
for linea in lineas:
    provincia, capital = linea.strip().split(",")
    if provincia.lower() == provincia_buscada.lower():
        print(f"✅ La capital de {provincia} es {capital}.")
        encontrada = True
        break

if not encontrada:
    print(f"❌ No encontré '{provincia_buscada}'.")

📌 Nota el truco: provincia, capital = linea.strip().split(",") — Python asigna cada elemento de la lista a una variable distinta. ¡Muy elegante!

⚠️ Errores comunes (y cómo solucionarlos)

Error ¿Qué significa? Solución
FileNotFoundError El archivo no existe Verifica el nombre y la ruta. ¿Está en la misma carpeta?
UnicodeDecodeError El archivo tiene caracteres extraños Guarda el archivo en codificación UTF-8 (casi todos los editores lo hacen por defecto)
El programa no muestra nada Olvidaste print() o el break está mal puesto Revisa la lógica del bucle

Si te sale FileNotFoundError:

try:
    with open("provincias.txt", "r") as archivo:
        lineas = archivo.readlines()
except FileNotFoundError:
    print("⚠️ No encontré el archivo 'provincias.txt'. ¿Lo creaste en la misma carpeta?")

🎯 Esto es manejo de errores básico. Lo profundizaremos en el Capítulo 6, pero desde ya acostúmbrate a pensar: "¿qué puede salir mal?".

🧩 Retos: Elige tu camino

Ahora que tienes la base funcionando, elige el reto que más te motive. No tienes que hacerlos todos, pero sí te recomiendo probar al menos uno.

🎨 Reto visual

Para los que piensan en imágenes

Modifica el programa para que muestre un pequeño "mapa ASCII" de la provincia encontrada. Por ejemplo:

╔══════════════════════╗
║   AZUAY              ║
║   Capital: Cuenca    ║
║    🏔️  🏔️  🏔️          ║
╚══════════════════════╝

🔢 Reto lógico

Para los que aman los datos

Haz que el programa cuente y muestre:

  1. Cuántas provincias hay registradas en el archivo.
  2. Cuántas veces se ha hecho una búsqueda exitosa en esta sesión (pista: usa una variable contador).

🌎 Reto de expansión

Para los curiosos

Descarga o crea un archivo con las 24 provincias del Ecuador y sus capitales. Puedes encontrar la lista en Wikipedia. Luego, haz que el programa liste todas las provincias si el usuario escribe "todas".

🗣️ Reto de accesibilidad

Para los empáticos

Agrega mensajes más amigables. Si el usuario escribe mal una provincia, busca la más parecida y sugiérele: "¿Quizás quisiste decir 'Azuay'?" (pista: investiga la biblioteca difflib).

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

Responde las siguientes preguntas para verificar tu comprensión sobre archivos en Python. Cada pregunta te dará retroalimentación inmediata.

Pregunta 1 de 5