Tiza Las materias del CBC
Practicar →

Pensamiento Computacional (090) · Unidad 5 — Entrada, salida y errores

Archivos

Un archivo es la forma de que los datos sobrevivan al programa. Se abre, se usa y se cierra — y lo que se lee siempre es texto.

Practicar este tema →7 ejercicios que te corrigen paso a paso · gratis, sin cuenta

La explicación

Por qué hacen falta

Las variables viven en memoria y desaparecen cuando el programa termina. Si querés que algo quede, tiene que ir al disco. Eso es un archivo.

Abrir, usar, cerrar

f = open("datos.txt", "r")
contenido = f.read()
f.close()

El segundo argumento es el modo:

"r"   leer         error si el archivo no existe
"w"   escribir     borra todo lo que había
"a"   agregar      escribe al final, conserva lo anterior
Cuidado con "w". Abrir en modo escritura vacía el archivo al instante, antes incluso de que escribas nada. Si querías agregar y pusiste "w", perdiste el contenido y no hay forma de recuperarlo. Cuando dudes entre "w" y "a", pensá si querés empezar de cero o sumar.

La forma recomendada: with

with open("datos.txt", "r") as f:
    contenido = f.read()
# acá afuera el archivo ya está cerrado

Cierra solo, incluso si adentro se produce un error. Con open y close sueltos, un error en el medio deja el archivo abierto. Usá siempre with.

Tres formas de leer

f.read()       → todo el contenido como un solo string
f.readlines()  → una lista con todas las líneas
for linea in f:  → de a una, sin cargar todo en memoria

La tercera es la que conviene con archivos grandes: no necesita que todo entre en memoria.

Dos cosas que siempre sorprenden al leer

1. Cada línea trae un salto al final. Si el archivo dice 25, lo que leés es "25\n". Por eso se usa .strip(), que saca espacios y saltos de los bordes.

2. Todo lo que se lee es texto. Igual que con input(): si es un número, hay que convertirlo con int() o float().
with open("edades.txt") as f:
    for linea in f:
        edad = int(linea.strip())   # las dos cosas

Escribir

with open("salida.txt", "w") as f:
    f.write("primera línea\n")
    f.write("segunda línea\n")

write no agrega el salto de línea: si no lo ponés vos, queda todo pegado en una sola línea. Y sólo escribe strings, así que los números van con str().

Ejemplo resuelto

Un archivo notas.txt tiene una nota por línea. Escribir una función que devuelva el promedio.

def promedio(nombre_archivo):
    total = 0
    cantidad = 0
    with open(nombre_archivo, "r") as f:
        for linea in f:
            total = total + int(linea.strip())
            cantidad = cantidad + 1
    return total / cantidad

Las tres cosas que hay que notar:

  1. Los acumuladores van antes del with. Si los pusieras adentro del for se reiniciarían en cada línea — el mismo error del tema 3.3.
  2. .strip() antes de int(). Sin eso, int("7\n") tira ValueError.
  3. with cierra solo. No hace falta f.close().
Esta función tiene un agujero: si el archivo está vacío, cantidad queda en 0 y total / cantidad tira ZeroDivisionError. La forma prolija:
if cantidad == 0:
    return 0   # o None, según qué tenga sentido
return total / cantidad
Los archivos vacíos existen, y son el caso que nadie prueba.

Control: el promedio tiene que quedar entre la nota más baja y la más alta del archivo. Si te da fuera de ese rango, revisá el acumulador.

Dónde se cae la mayoría

Hasta acá la explicación. La práctica es la otra mitad: 7 ejercicios de este tema, en cuatro niveles, que no te dicen sólo si está bien al final sino que te corrigen en cada paso y te explican por qué. Además trae una animación que muestra la idea en movimiento.

Practicar Archivos →

Ver todos los temas de Pensamiento Computacional