PythonAprende PythonDocumentación

pathlib, JSON y CSV

Rutas modernas, el formato de datos universal y tablas planas.

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:

PythonJSON
dictobjeto {}
listarreglo []
strstring
int/floatnumber
True/Falsetrue/false
Nonenull

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.Path con el operador /: rutas multiplataforma y legibles
  • json.dumps/loads para strings; json.dump/load para archivos
  • csv.DictReader entrega filas como dicts con los encabezados como claves
  • CSV = todo texto; JSON = tipos nativos; ambos con with open

Quiz

  1. 1. ¿Qué ventaja tiene pathlib.Path("datos") / "archivo.json" sobre concatenar strings con / ?

  2. 2. ¿Cuál es la diferencia entre json.loads y json.dumps?

  3. 3. Al leer un CSV con csv.reader, ¿qué recibe cada iteración?

Ejercicios

Ejercicio 1: Serializar a JSON

Importa json e imprime json.dumps({"nombre": "Ana", "edad": 25}). Observa el formato exacto de la salida.

Cargando editor…

Ejercicio 2: Round-trip JSON

Completa `guardar_y_leer(datos)` para que serialice el dict a string JSON con json.dumps y lo recupere con json.loads, devolviendo el dict original.

Cargando editor…