QuieroProgramar por Rodri Gonzalez
Python · Lección 24 de 27

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.

90–110 min Prerrequisitos: 20 Módulos stdlib, 23 Strings avanzado
01

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()
Regla absoluta: SIEMPRE usá 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
PELIGRO con modo "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

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
En el trabajo: un pipeline típico de datos es: (1) leer CSVs de una carpeta, (2) limpiar y procesar con pandas, (3) guardar resultados en CSV/JSON/Excel. Con 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 para datos argentinos: siempre especificá 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.
02

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.

ejemplo_01_texto.pyPython

                
Hacé clic en ▶ Ejecutar

Ejemplo 2: CSV — leer y escribir con csv.DictReader/DictWriter

ejemplo_02_csv.pyPython

                
Hacé clic en ▶ Ejecutar

Ejemplo 3: JSON — persistir datos estructurados

ejemplo_03_json_archivo.pyPython

                
Hacé clic en ▶ Ejecutar

Ejemplo 4: Append — agregar al final sin perder datos

ejemplo_04_append.pyPython

                
Hacé clic en ▶ Ejecutar

Ejemplo 5: pathlib + procesamiento de múltiples archivos

ejemplo_05_pathlib.pyPython

                
Hacé clic en ▶ Ejecutar
03

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
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: Escribir y leer texto

Escribí 3 líneas en saludo.txt y después leé e imprimí el contenido. Debe incluir Hola.

ejercicio_01.pyDebe incluir "Hola"

                    
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

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.

ejercicio_02.pyDebe incluir "5"

                    
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 3: Escribir y leer JSON

Guardá un diccionario como JSON y después leelo. Debe incluir García.

ejercicio_03.pyDebe incluir "García"

                    
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

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.

ejercicio_04.pyDebe incluir "515000"

                    
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

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.

ejercicio_05.pyDebe incluir "registros"

                    
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: pathlib para listar archivos

Creá 3 archivos .txt en un directorio y después listalos con Path.glob(). Debe incluir .txt.

ejercicio_06.pyDebe incluir ".txt"

                    
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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.

ejercicio_07.pyDebe incluir "aprobados"

                    
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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.

ejercicio_08.pyDebe incluir "promedio"

                    
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

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.

ejercicio_09.pyDebe incluir "consolidado"

                    
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

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.

ejercicio_10_desafio.pyDebe incluir "PERSISTENCIA"

                    
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

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