Geocodificar un CSV de direcciones con Python
Principiante15 minPython, eviav
Tenés un CSV con direcciones y querés agregarle coordenadas. Con el cliente eviav lo resolvés en pocas líneas, con reintentos automáticos en 429/5xx.
1. Instalar
pip install eviav
2. El script
import csv
from eviav import Client, EviavError
client = Client(api_key="eviav_live_…") # max_retries=2 por defecto
with open("direcciones.csv") as fin, open("salida.csv", "w", newline="") as fout:
reader = csv.DictReader(fin)
writer = csv.DictWriter(fout, fieldnames=[*reader.fieldnames, "lat", "lon"])
writer.writeheader()
for row in reader:
try:
res = client.geocode(row["direccion"])
top = res["results"][0] if res.get("results") else None
row["lat"] = top["lat"] if top else ""
row["lon"] = top["lon"] if top else ""
except EviavError as e:
print(f"fila {row['direccion']!r} falló: {e.code} ({e.status})")
row["lat"] = row["lon"] = ""
writer.writerow(row)
client.close()
3. Async para mayor throughput
Si tenés decenas de miles de filas, la versión async procesa en paralelo respetando el rate limit:
import asyncio
from eviav import AsyncClient
async def geocode_all(direcciones):
async with AsyncClient(api_key="…") as client:
sem = asyncio.Semaphore(10) # 10 en paralelo
async def one(d):
async with sem:
return await client.geocode(d)
return await asyncio.gather(*(one(d) for d in direcciones))
Notas
- El free tier de geocoding es de 100k req/mes — un CSV de hasta 100k filas no te cuesta nada.
- El cliente honra
Retry-After, así que no necesitás manejar el rate limit a mano.