🔒 Registro cerrado · Apertura oficial próximamente · Acceso exclusivo para alumnos activos
Iniciar SesiónEstructuras de datos de la inteligencia: JSON y CSV
5 tareas · 40 min · Principiante
Martes 10 de noviembre de 2026, 08:00. En la Cooperativa de Ahorro Los Cerezos el SOC no recibió esta mañana su lista de vigilancia: el guion que pasa el boletín de la mesa sectorial a un CSV se cayó dos veces. Casi todo lo que maneja un equipo de inteligencia llega en JSON y sale en CSV, y casi todos los fallos de un guion de analista nacen en ese paso: un dato que no está, un número escrito como texto, una lista metida en una celda. Se abre la carpeta del boletín y se leen el guion, los datos y el registro. Nada se ejecuta: todo es texto para revisar.
Objetivo de la sala
Martes 10 de noviembre de 2026, 08:00. En la Cooperativa de Ahorro Los Cerezos el SOC no recibió esta mañana su lista de vigilancia: el guion que pasa el boletín de la mesa sectorial a un CSV se cayó dos veces. Casi todo lo que maneja un equipo de inteligencia llega en JSON y sale en CSV, y casi todos los fallos de un guion de analista nacen en ese paso: un dato que no está, un número escrito como texto, una lista metida en una celda. Se abre la carpeta del boletín y se leen el guion, los datos y el registro. Nada se ejecuta: todo es texto para revisar.JSON tiene pocas clases de valores: objetos entre llaves, arreglos entre corchetes, cadenas entre comillas, números, true/false y null. Cuando un guion hace json.load, cada una se convierte en un tipo de Python: el objeto en dict, el arreglo en list, la cadena en str, el número en int o float, true y false en True y False, y null en None.
Un boletín de indicadores casi siempre es un objeto con una lista de objetos dentro: aquí, boletin["indicadores"] es una lista y cada entrada es un diccionario. Saber qué tipo llega evita los dos errores más comunes del oficio: tratar un valor vacío como si fuera texto y comparar un número con una cadena.
En la terminal, abre boletin-sectorial.json con cat y mira la entrada BS-45-02.
Responde para continuar
La entrada BS-45-02 trae la clave vence con el valor null. ¿Qué recibe el guion cuando lee entrada["vence"] en esa entrada?
Ver pista de ayuda
Repasa a qué tipo de Python se convierte cada clase de valor de JSON.
Hay dos formas de leer una clave de un diccionario. entrada["confianza"] exige que la clave exista y, si no está, lanza KeyError y detiene el guion. entrada.get("confianza", 0) devuelve el valor por defecto que se le pase cuando falta. Ninguna es mejor por sí sola: la primera para el guion ante un dato roto; la segunda lo deja seguir, pero decide algo por el analista.
Un traceback dice qué clave faltó y en qué línea, pero no en qué entrada de los datos: eso hay que buscarlo. Lee LEEME.txt y después lee_boletin.log: la versión 1 del guion se detuvo a las 07:00.
Responde para continuar
¿Qué entrada del boletín hizo que la ejecución de las 07:00 se detuviera? Escribe su id.
Ver pista de ayuda
El error nombra la clave que faltó. Busca en el boletín la única entrada que no la trae.
En JSON, 75 y "75" son cosas distintas: el primero es un número y el segundo una cadena que se parece a un número. Python no los mezcla: comparar una cadena con un entero usando < o >= lanza TypeError. La mesa sectorial genera el boletín con varias herramientas, y no todas escriben igual el mismo campo.
La versión 2 del guion cambió la lectura de la confianza por .get y añadió un filtro para quedarse solo con lo de confianza alta. A las 07:40 volvió a caer, esta vez por otro motivo. Lee la línea 12 de lee_boletin.py y el segundo error del registro.
Responde para continuar
¿Qué entrada del boletín detuvo la ejecución de las 07:40? Escribe su id.
Ver pista de ayuda
El error dice que se comparó una cadena con un entero. Busca la confianza escrita entre comillas.
Un CSV es plano: una fila, unas columnas, un texto por celda. csv.DictWriter escribe cada valor convirtiéndolo a texto, y una lista de Python convertida a texto conserva sus corchetes y sus comillas simples. Si ese texto lleva una coma, el módulo csv lo encierra entre comillas dobles para que no se parta en dos columnas. El archivo resultante es un CSV válido, pero eso no significa que quien lo recibe lo entienda.
El lunes el guion terminó bien. Abre vigilancia-lunes.csv, que es lo que recibió el SOC ese día, y después importador-soc.txt, que explica cómo lo lee el SOC.
Responde para continuar
¿Qué cambio en la línea 18 deja la columna etiquetas como la espera el importador del SOC?
Ver pista de ayuda
El importador dice con qué separador espera las etiquetas y qué hace con cualquier otro formato.
.get("confianza", 0) evitó el KeyError de las 07:00, pero no es neutral: decide que una entrada sin confianza vale 0. Con el filtro de la línea 12, esa decisión tiene consecuencias. Supón que el siguiente cambio convierte la confianza a número con int(...) antes de comparar, para resolver lo de las 07:40, y que el guion por fin termina.
Un valor por defecto es una regla del análisis escrita en el código, y debería verse: lo sano es contar las entradas a las que les falta un dato y dejarlas en el registro para que alguien decida, no esconderlas.
Responde para continuar
Con la confianza ya convertida a número, ¿qué le pasaría a la entrada BS-45-07 en la versión 2?
Ver pista de ayuda
Sigue la entrada por las líneas 11 a 13 con el valor por defecto que le asigna .get.
Whoami-Labs Pro
Whoami-Labs Pro utiliza cookies
Utilizamos cookies y almacenamiento local para el funcionamiento del sitio, seguridad de sesión y, si lo autorizas, analítica y marketing. Puedes aceptar, rechazar o personalizar. Política de Privacidad
Preferencias
Configuraciones de cookies
Elige qué categorías permitir. Las esenciales siempre están activas. Consulta la Política de Privacidad.
Esenciales
Siempre activas · sesión, CSRF, tema y esta preferencia
Necesarias para iniciar sesión, proteger formularios (CSRF) y recordar tu elección de cookies y tema. Sin ellas la plataforma no funciona de forma segura.
Analíticos
Hoy no activos en la plataforma; listos para cuando se conecten
Nos ayudan a entender uso de cursos y páginas. Si los activas, se usarán cuando conectemos analítica; hasta entonces no se carga ningún tracker.
Marketing
Hoy no activos; campañas futuras solo con tu permiso
Comunicaciones o campañas. No activos hoy en la plataforma; quedarán listos si los conectamos y solo si los permites.