Más allá de open(): pathlib maneja rutas como objetos, JSON es el idioma universal de los datos y CSV es la tabla plana de la humanidad.
pathlib: rutas como objetos
Olvida pegar strings con / a mano (rompe entre Windows y Linux):
from pathlib import Path
ruta = Path("datos") / "usuarios" / "ana.json" # se une con el separador correcto
print(ruta) # datos/usuarios/ana.json
Path("datos").exists() # True/False
Path("informe.txt").read_text() # leer de un tirón
Path("salida.txt").write_text("hola") # escribir de un tirón
Path("proyecto/src").mkdir(parents=True, exist_ok=True) # crear carpetas
for archivo in Path(".").glob("*.py"): # buscar por patrón
print(archivo.name) # solo el nombre
print(Path("a/b/c.txt").stem) # c (nombre sin extensión)
print(Path("a/b/c.txt").suffix) # .txt
pathlib es la API moderna y multiplataforma. En código nuevo, no uses os.path.
JSON: el formato de intercambio
import json
usuario = {"nombre": "Ana", "edad": 25, "lenguajes": ["Python", "SQL"]}
# objetos Python → string JSON
texto = json.dumps(usuario, indent=2, ensure_ascii=False)
# string JSON → objetos Python
datos = json.loads('{"activo": true, "puntaje": 99}')
print(datos["puntaje"]) # 99
La conversión es automática:
| Python | JSON |
|---|---|
dict | objeto {} |
list | arreglo [] |
str | string |
int/float | number |
True/False | true/false |
None | null |
Para archivos: json.dump(datos, f) y json.load(f) (sin la s de string).
with open("config.json", "w") as f:
json.dump(usuario, f, indent=2)
with open("config.json") as f:
configuracion = json.load(f)
El round-trip completo: dict → string → dict. Ojo: JSON no tiene tuplas (llegan como listas) ni claves int (llegan como strings).
CSV: tablas simples
import csv
# escribir
with open("personas.csv", "w", newline="") as f:
escritor = csv.writer(f)
escritor.writerow(["nombre", "edad"])
escritor.writerow(["Ana", 25])
escritor.writerow(["Luis", 30])
# leer como listas
with open("personas.csv", newline="") as f:
for fila in csv.reader(f):
print(fila) # ['nombre', 'edad'] / ['Ana', '25'] ← todo str
# leer como diccionarios (¡usa los encabezados!)
with open("personas.csv", newline="") as f:
for persona in csv.DictReader(f):
print(persona["nombre"], persona["edad"])
El parámetro newline="" al abrir CSVs es obligatorio — sin él aparecen líneas en blanco fantasma en Windows.
CSV guarda todo como texto: la edad "25" llega como string. Convierte con int() al procesar.
Resumen
pathlib.Pathcon el operador/: rutas multiplataforma y legiblesjson.dumps/loadspara strings;json.dump/loadpara archivoscsv.DictReaderentrega filas como dicts con los encabezados como claves- CSV = todo texto; JSON = tipos nativos; ambos con
with open