Loading
_ DESCIFRANDO CONEXIÓN SEGURA...

Estructuras 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.

0 de 5 · 0%

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.

Inicia sesión para registrar tus puntos y progreso en el ranking.

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