EviavEviav · Docs
← Tutoriales

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.