Archivos
Hasta ahora tus datos vivían solo en memoria — al cerrar el programa, desaparecían. Con archivos, podés leer datos de CSVs y JSONs, guardar resultados, y construir pipelines que procesen datos reales del disco.
Concepto teórico
open() y el context manager with
La función open() abre un archivo y devuelve un objeto que podés leer o escribir. El patrón
with garantiza que el archivo se cierre correctamente incluso si hay un error:
# ✅ SIEMPRE usá with (cierra automáticamente)
with open("datos.txt", "r", encoding="utf-8") as f:
contenido = f.read()
# ❌ NUNCA hagas esto (puede no cerrar si hay error)
# f = open("datos.txt")
# contenido = f.read()
# f.close()
with open(...) as f:. Nunca
abras archivos sin with. El context manager garantiza que el archivo se cierra al salir del
bloque, incluso si el código lanza una excepción. Archivos no cerrados pueden corromper datos o consumir
recursos del sistema.Modos de apertura
| Modo | Significado | Si el archivo no existe | Contenido previo |
|---|---|---|---|
"r" |
Read (lectura) | Error (FileNotFoundError) | Se lee |
"w" |
Write (escritura) | Se crea | SE BORRA TODO |
"a" |
Append (agregar al final) | Se crea | Se conserva |
"r+" |
Lectura + escritura | Error | Se conserva |
"rb" / "wb" |
Binario (imágenes, PDFs) | Según r/w | Según r/w |
open("datos.csv", "w") BORRA TODO
el contenido del archivo existente al abrirlo. Si querés agregar sin borrar, usá "a". Este
error ha destruido datos de producción en empresas reales.Métodos de lectura
.read()— lee TODO el archivo como un solo string. Cuidado con archivos grandes (carga todo en RAM)..readline()— lee UNA línea (hasta el\n)..readlines()— lee TODAS las líneas como lista de strings.for linea in f:— itera línea por línea SIN cargar todo en memoria (lo más eficiente para archivos grandes).
CSV con el módulo csv
CSV (Comma-Separated Values) es el formato más común en análisis de datos. Python tiene un módulo
csv incorporado, pero en la práctica casi siempre usás pandas.read_csv() que
es más poderoso.
import csv
# Leer CSV
with open("datos.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f) # cada fila es un dict
for fila in reader:
print(fila["nombre"], fila["saldo"])
# Escribir CSV
with open("salida.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["nombre", "saldo"])
writer.writeheader()
writer.writerow({"nombre": "García", "saldo": 150000})
JSON con archivos
import json
# Leer JSON
with open("config.json", "r") as f:
datos = json.load(f) # archivo → dict
# Escribir JSON
with open("resultado.json", "w") as f:
json.dump(datos, f, indent=2, ensure_ascii=False)
pathlib — manejo moderno de rutas
pathlib es la forma moderna y recomendada de trabajar con rutas de archivos (reemplaza
os.path):
from pathlib import Path
ruta = Path("datos") / "clientes" / "2025" / "q1.csv" # construir rutas con /
print(ruta.exists()) # ¿existe?
print(ruta.suffix) # extensión: .csv
print(ruta.stem) # nombre sin extensión: q1
print(ruta.parent) # directorio padre
list(Path(".").glob("*.py")) # todos los .py en directorio actual
pathlib manejás las rutas, con open() los archivos de texto, con
pandas los DataFrames. Entender archivos "a mano" con open/csv/json te da control total
cuando pandas no alcanza.
encoding="utf-8" al abrir archivos. Si falla (UnicodeDecodeError), probá
encoding="latin-1". Los exports de sistemas bancarios legacy, MERCAP y SINENSUP suelen
venir en Latin-1.
Ejemplos explicados paso a paso
Ejemplo 1: Escribir y leer un archivo de texto
Nota: en Pyodide (navegador) los archivos se crean en memoria virtual. En tu PC, se crean en disco real.
Hacé clic en ▶ Ejecutar
Ejemplo 2: CSV — leer y escribir con csv.DictReader/DictWriter
Hacé clic en ▶ Ejecutar
Ejemplo 3: JSON — persistir datos estructurados
Hacé clic en ▶ Ejecutar
Ejemplo 4: Append — agregar al final sin perder datos
Hacé clic en ▶ Ejecutar
Ejemplo 5: pathlib + procesamiento de múltiples archivos
Hacé clic en ▶ Ejecutar
Referencia rápida
| Operación | Código | Nota |
|---|---|---|
| Leer todo | f.read() |
Cuidado con archivos grandes |
| Leer líneas | f.readlines() |
Devuelve lista con \n |
| Iterar líneas | for linea in f: |
Más eficiente en memoria |
| Escribir | f.write(texto) |
No agrega \n automático |
| CSV leer | csv.DictReader(f) |
Filas como dicts (strings) |
| CSV escribir | csv.DictWriter(f, fields) |
Usar newline="" |
| JSON leer | json.load(f) |
Archivo → dict/list |
| JSON escribir | json.dump(d, f, indent=2) |
Dict → archivo |
| Ruta | Path("a") / "b" / "c.csv" |
pathlib moderno |
| Listar | Path(".").glob("*.csv") |
Buscar archivos |
Ejercicios
Ejercicio 1: Escribir y leer texto
Escribí 3 líneas en saludo.txt y después leé e imprimí el contenido. Debe incluir
Hola.
Hacé clic en ▶ Ejecutar
Ejercicio 2: Contar líneas de un archivo
Escribí 5 líneas en un archivo y después contá cuántas tiene con readlines(). Debe
incluir 5.
Hacé clic en ▶ Ejecutar
Ejercicio 3: Escribir y leer JSON
Guardá un diccionario como JSON y después leelo. Debe incluir García.
Hacé clic en ▶ Ejecutar
Ejercicio 4: CSV con DictWriter y DictReader
Escribí 3 clientes en un CSV y después leelos e imprimí el total de saldos. Debe incluir
515000.
Hacé clic en ▶ Ejecutar
Ejercicio 5: Append al log
Creá una función log(mensaje) que agregue al final de app.log con
timestamp. Llamala 3 veces. Debe incluir log.
Hacé clic en ▶ Ejecutar
Ejercicio 6: pathlib para listar archivos
Creá 3 archivos .txt en un directorio y después listalos con Path.glob(). Debe incluir
.txt.
Hacé clic en ▶ Ejecutar
Ejercicio 7: Pipeline leer CSV → procesar → guardar JSON
Escribí un CSV de 4 clientes, leelo, filtrá score >= 650, y guardá los aprobados como JSON. Debe
incluir aprobados.
Hacé clic en ▶ Ejecutar
Ejercicio 8: Leer archivo línea por línea y procesar
Creá un archivo con 1000 números (uno por línea), después leelo línea por línea calculando suma y
promedio SIN cargar todo en memoria. Debe incluir promedio.
Hacé clic en ▶ Ejecutar
Ejercicio 9: Consolidar múltiples JSONs
Creá 3 archivos JSON (uno por mes con lista de saldos). Después leé los 3 con glob y
consolidá el total. Debe incluir consolidado.
Hacé clic en ▶ Ejecutar
Ejercicio 10: Sistema de persistencia completo
Creá un mini sistema CRUD que guarde clientes en un JSON: funciones cargar(),
guardar(), agregar_cliente(), listar(). Los datos deben
persistir entre llamadas. Debe incluir PERSISTENCIA.
Hacé clic en ▶ Ejecutar
Resumen y conexión
- SIEMPRE usá
with open(...) as f:— nunca open() sin context manager. - Modos:
"r"(leer),"w"(escribir — BORRA),"a"(append). csv.DictReader/DictWriterpara CSV.json.load/dumppara JSON.for linea in f:es la forma más eficiente de leer archivos grandes.pathlib.Pathes la forma moderna de manejar rutas (reemplaza os.path).- Siempre especificá
encoding="utf-8". Si falla, probá"latin-1".
En la siguiente lección (25 · Excepciones y errores) vas a aprender a manejar errores de forma profesional: try/except, tipos de errores, raise y patrones EAFP vs LBYL.
Recursos: Python docs — Files · pathlib