Capítulo 1: Archivos y persistencia de datos en Python
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.
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 ✅ |
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:
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.
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 |
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.
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.
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.
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.
Vamos a construir un programa real. El usuario escribirá el nombre de una provincia y el programa le dirá su capital.
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?")
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.
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):
strip(): Elimina espacios y el salto de línea (\\n) al final.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.
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.
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!
| 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?".
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.
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 ║
║ 🏔️ 🏔️ 🏔️ ║
╚══════════════════════╝
Para los que aman los datos
Haz que el programa cuente y muestre:
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".
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).
Responde las siguientes preguntas para verificar tu comprensión sobre archivos en Python. Cada pregunta te dará retroalimentación inmediata.
Pregunta 1 de 5