{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Ejercicios con ficheros JSON\n",
    "\n",
    "En este notebook se trabaja con una lista de alumnos almacenada en un fichero JSON. Ejecuta las celdas en orden, de arriba abajo.\n",
    "\n",
    "> **Importante:** los ejercicios 11, 12 y 13 modifican la lista `alumnos`. Para recuperar los datos iniciales, vuelve a ejecutar las celdas de creación y carga del fichero.\n"
   ],
   "id": "72817eb5063ebdd7"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Crear el fichero de ejemplo\n",
    "\n",
    "Esta celda crea `alumnos.json` en la misma carpeta que el notebook. En JSON los booleanos se escriben como `true` y `false`, pero en Python se utilizan `True` y `False`.\n"
   ],
   "id": "573aa198fb5b0574"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T13:23:23.643543Z",
     "start_time": "2026-09-14T13:23:23.617541Z"
    }
   },
   "source": [
    "import json\n",
    "\n",
    "datos_iniciales = [\n",
    "    {\"id\": 1, \"nombre\": \"Ane\", \"edad\": 20, \"curso\": \"DAM\", \"nota\": 8.5, \"activo\": True},\n",
    "    {\"id\": 2, \"nombre\": \"Jon\", \"edad\": 22, \"curso\": \"DAW\", \"nota\": 6.7, \"activo\": True},\n",
    "    {\"id\": 3, \"nombre\": \"Maialen\", \"edad\": 19, \"curso\": \"DAM\", \"nota\": 4.2, \"activo\": False},\n",
    "    {\"id\": 4, \"nombre\": \"Unai\", \"edad\": 21, \"curso\": \"ASIR\", \"nota\": 7.8, \"activo\": True}\n",
    "]\n",
    "\n",
    "with open(\"alumnos.json\", \"w\", encoding=\"utf-8\") as fichero:\n",
    "    json.dump(datos_iniciales, fichero, indent=4, ensure_ascii=False)\n",
    "\n",
    "print(\"Se ha creado el fichero alumnos.json\")\n"
   ],
   "id": "c19a35eb3f344e30",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Se ha creado el fichero alumnos.json\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Cargar el fichero JSON\n",
    "\n",
    "`json.load()` convierte el contenido del fichero en una estructura de datos de Python. En este caso devuelve una lista de diccionarios.\n"
   ],
   "id": "40722d42423999d"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:25:57.850217300Z",
     "start_time": "2026-09-14T10:25:57.799238600Z"
    }
   },
   "source": [
    "with open(\"alumnos.json\", \"r\", encoding=\"utf-8\") as fichero:\n",
    "    alumnos = json.load(fichero)\n",
    "\n",
    "print(\"Número de alumnos:\", len(alumnos))\n"
   ],
   "id": "111d6edbaf68d74",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Número de alumnos: 4\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 1. Mostrar todo el contenido\n"
   ],
   "id": "3292623e7f4b471a"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:26:50.632565100Z",
     "start_time": "2026-09-14T10:26:50.592315Z"
    }
   },
   "source": "print(alumnos)\n",
   "id": "5205bd3f65e6482f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{'id': 1, 'nombre': 'Ane', 'edad': 20, 'curso': 'DAM', 'nota': 8.5, 'activo': True}, {'id': 2, 'nombre': 'Jon', 'edad': 22, 'curso': 'DAW', 'nota': 6.7, 'activo': True}, {'id': 3, 'nombre': 'Maialen', 'edad': 19, 'curso': 'DAM', 'nota': 4.2, 'activo': False}, {'id': 4, 'nombre': 'Unai', 'edad': 21, 'curso': 'ASIR', 'nota': 7.8, 'activo': True}]\n"
     ]
    }
   ],
   "execution_count": 6
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 2. Mostrar solo los nombres\n"
   ],
   "id": "ac5ef4b64fef6304"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:29:54.010410800Z",
     "start_time": "2026-09-14T10:29:53.956409Z"
    }
   },
   "source": [
    "for alumno in alumnos:\n",
    "    print(alumno[\"nombre\"])\n"
   ],
   "id": "537ab4c656fea8f8",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ane\n",
      "Jon\n",
      "Maialen\n",
      "Unai\n"
     ]
    }
   ],
   "execution_count": 7
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 3. Mostrar el nombre y la nota\n"
   ],
   "id": "272ea89b1bf79a6f"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:29:56.251991Z",
     "start_time": "2026-09-14T10:29:56.197797400Z"
    }
   },
   "source": [
    "for alumno in alumnos:\n",
    "    print(alumno[\"nombre\"], \"-\", alumno[\"nota\"])\n"
   ],
   "id": "b4f289c4b20cfc29",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ane - 8.5\n",
      "Jon - 6.7\n",
      "Maialen - 4.2\n",
      "Unai - 7.8\n"
     ]
    }
   ],
   "execution_count": 8
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 4. Mostrar el alumnado aprobado\n"
   ],
   "id": "d521e7b62d80fa83"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:29:58.424878800Z",
     "start_time": "2026-09-14T10:29:58.351633200Z"
    }
   },
   "source": [
    "for alumno in alumnos:\n",
    "    if alumno[\"nota\"] >= 5:\n",
    "        print(alumno[\"nombre\"])\n"
   ],
   "id": "3aab68de21a7afc2",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ane\n",
      "Jon\n",
      "Unai\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 5. Mostrar el alumnado de DAM\n"
   ],
   "id": "b5ab98f1d168de2e"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:30:03.094714Z",
     "start_time": "2026-09-14T10:30:03.031710Z"
    }
   },
   "source": [
    "for alumno in alumnos:\n",
    "    if alumno[\"curso\"] == \"DAM\":\n",
    "        print(alumno[\"nombre\"])\n"
   ],
   "id": "323e09035f1822e4",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ane\n",
      "Maialen\n"
     ]
    }
   ],
   "execution_count": 10
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 6. Mostrar el alumnado activo\n"
   ],
   "id": "dada7db6dd17d53"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:30:05.070129500Z",
     "start_time": "2026-09-14T10:30:05.023419500Z"
    }
   },
   "source": [
    "for alumno in alumnos:\n",
    "    if alumno[\"activo\"]:\n",
    "        print(alumno[\"nombre\"])\n"
   ],
   "id": "efaf3823684dee85",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ane\n",
      "Jon\n",
      "Unai\n"
     ]
    }
   ],
   "execution_count": 11
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 7. Calcular la nota media\n"
   ],
   "id": "e3e323dae4b1c274"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:30:06.521598Z",
     "start_time": "2026-09-14T10:30:06.480993800Z"
    }
   },
   "source": [
    "suma = 0\n",
    "\n",
    "for alumno in alumnos:\n",
    "    suma += alumno[\"nota\"]\n",
    "\n",
    "media = suma / len(alumnos)\n",
    "print(\"Nota media:\", media)\n"
   ],
   "id": "c1c4e541b29dc233",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Nota media: 6.8\n"
     ]
    }
   ],
   "execution_count": 12
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 8. Buscar un alumno por nombre\n"
   ],
   "id": "2a5fd1bd26ae0eb6"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:30:08.450376500Z",
     "start_time": "2026-09-14T10:30:08.404162300Z"
    }
   },
   "source": [
    "nombre_buscar = \"Jon\"\n",
    "\n",
    "for alumno in alumnos:\n",
    "    if alumno[\"nombre\"] == nombre_buscar:\n",
    "        print(alumno)\n"
   ],
   "id": "6568710fd52cb743",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'id': 2, 'nombre': 'Jon', 'edad': 22, 'curso': 'DAW', 'nota': 6.7, 'activo': True}\n"
     ]
    }
   ],
   "execution_count": 13
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 9. Buscar al alumno con mayor nota\n"
   ],
   "id": "2b6ee87a51b3ff7a"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:30:10.014677300Z",
     "start_time": "2026-09-14T10:30:09.986531800Z"
    }
   },
   "source": [
    "mejor = alumnos[0]\n",
    "\n",
    "for alumno in alumnos:\n",
    "    if alumno[\"nota\"] > mejor[\"nota\"]:\n",
    "        mejor = alumno\n",
    "\n",
    "print(mejor[\"nombre\"], mejor[\"nota\"])\n"
   ],
   "id": "dfe723e161ecd872",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ane 8.5\n"
     ]
    }
   ],
   "execution_count": 14
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 10. Contar alumnos por curso\n"
   ],
   "id": "9b8d55bbd5badf61"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:30:11.722597Z",
     "start_time": "2026-09-14T10:30:11.698828200Z"
    }
   },
   "source": [
    "cursos = {}\n",
    "\n",
    "for alumno in alumnos:\n",
    "    curso = alumno[\"curso\"]\n",
    "\n",
    "    if curso in cursos:\n",
    "        cursos[curso] += 1\n",
    "    else:\n",
    "        cursos[curso] = 1\n",
    "\n",
    "print(cursos)\n"
   ],
   "id": "960502330e99256b",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'DAM': 2, 'DAW': 1, 'ASIR': 1}\n"
     ]
    }
   ],
   "execution_count": 15
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 11. Modificar la nota de un alumno\n",
    "\n",
    "Después de modificar la lista, los cambios se guardan en `alumnos.json`.\n"
   ],
   "id": "64d00d58a509d417"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:30:14.665963900Z",
     "start_time": "2026-09-14T10:30:14.624863400Z"
    }
   },
   "source": [
    "for alumno in alumnos:\n",
    "    if alumno[\"nombre\"] == \"Maialen\":\n",
    "        alumno[\"nota\"] = 5.5\n",
    "\n",
    "with open(\"alumnos.json\", \"w\", encoding=\"utf-8\") as fichero:\n",
    "    json.dump(alumnos, fichero, indent=4, ensure_ascii=False)\n",
    "\n",
    "print(alumnos)\n"
   ],
   "id": "d5388a70a5294d83",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{'id': 1, 'nombre': 'Ane', 'edad': 20, 'curso': 'DAM', 'nota': 8.5, 'activo': True}, {'id': 2, 'nombre': 'Jon', 'edad': 22, 'curso': 'DAW', 'nota': 6.7, 'activo': True}, {'id': 3, 'nombre': 'Maialen', 'edad': 19, 'curso': 'DAM', 'nota': 5.5, 'activo': False}, {'id': 4, 'nombre': 'Unai', 'edad': 21, 'curso': 'ASIR', 'nota': 7.8, 'activo': True}]\n"
     ]
    }
   ],
   "execution_count": 16
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 12. Añadir un alumno nuevo\n",
    "\n",
    "Se añade un diccionario a la lista mediante `append()` y después se actualiza el fichero.\n"
   ],
   "id": "b6a1ce849e43d59a"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:30:18.200245500Z",
     "start_time": "2026-09-14T10:30:18.173434900Z"
    }
   },
   "source": [
    "nuevo_alumno = {\n",
    "    \"id\": 5,\n",
    "    \"nombre\": \"Nerea\",\n",
    "    \"edad\": 23,\n",
    "    \"curso\": \"DAW\",\n",
    "    \"nota\": 9.1,\n",
    "    \"activo\": True\n",
    "}\n",
    "\n",
    "alumnos.append(nuevo_alumno)\n",
    "\n",
    "with open(\"alumnos.json\", \"w\", encoding=\"utf-8\") as fichero:\n",
    "    json.dump(alumnos, fichero, indent=4, ensure_ascii=False)\n",
    "\n",
    "print(alumnos)\n"
   ],
   "id": "d818c01ea5138a44",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{'id': 1, 'nombre': 'Ane', 'edad': 20, 'curso': 'DAM', 'nota': 8.5, 'activo': True}, {'id': 2, 'nombre': 'Jon', 'edad': 22, 'curso': 'DAW', 'nota': 6.7, 'activo': True}, {'id': 3, 'nombre': 'Maialen', 'edad': 19, 'curso': 'DAM', 'nota': 5.5, 'activo': False}, {'id': 4, 'nombre': 'Unai', 'edad': 21, 'curso': 'ASIR', 'nota': 7.8, 'activo': True}, {'id': 5, 'nombre': 'Nerea', 'edad': 23, 'curso': 'DAW', 'nota': 9.1, 'activo': True}]\n"
     ]
    }
   ],
   "execution_count": 17
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 13. Eliminar un alumno\n",
    "\n",
    "El `break` detiene la búsqueda cuando se encuentra y elimina a Jon.\n"
   ],
   "id": "5d373707d3dddee9"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-09-14T10:31:12.622461500Z",
     "start_time": "2026-09-14T10:31:12.590437600Z"
    }
   },
   "source": [
    "for alumno in alumnos:\n",
    "    if alumno[\"nombre\"] == \"Jon\":\n",
    "        alumnos.remove(alumno)\n",
    "        break\n",
    "\n",
    "with open(\"alumnos.json\", \"w\", encoding=\"utf-8\") as fichero:\n",
    "    json.dump(alumnos, fichero, indent=4, ensure_ascii=False)\n",
    "\n",
    "print(alumnos)\n"
   ],
   "id": "c79fdb847981b847",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{'id': 1, 'nombre': 'Ane', 'edad': 20, 'curso': 'DAM', 'nota': 8.5, 'activo': True}, {'id': 3, 'nombre': 'Maialen', 'edad': 19, 'curso': 'DAM', 'nota': 5.5, 'activo': False}, {'id': 4, 'nombre': 'Unai', 'edad': 21, 'curso': 'ASIR', 'nota': 7.8, 'activo': True}, {'id': 5, 'nombre': 'Nerea', 'edad': 23, 'curso': 'DAW', 'nota': 9.1, 'activo': True}]\n"
     ]
    }
   ],
   "execution_count": 18
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicio 14. Crear un nuevo JSON con los aprobados\n",
    "\n",
    "Se recorren los alumnos actuales y se guardan en otro fichero únicamente quienes tienen una nota igual o superior a 5.\n"
   ],
   "id": "5864b61139e13ae5"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "aprobados = []\n",
    "\n",
    "for alumno in alumnos:\n",
    "    if alumno[\"nota\"] >= 5:\n",
    "        aprobados.append(alumno)\n",
    "\n",
    "with open(\"aprobados.json\", \"w\", encoding=\"utf-8\") as fichero:\n",
    "    json.dump(aprobados, fichero, indent=4, ensure_ascii=False)\n",
    "\n",
    "print(\"Se ha creado el fichero aprobados.json\")\n"
   ],
   "id": "7d41ef2e4cce18ca"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Comprobar el contenido de aprobados.json\n"
   ],
   "id": "3f15acca10794ab3"
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(\"aprobados.json\", \"r\", encoding=\"utf-8\") as fichero:\n",
    "    aprobados_guardados = json.load(fichero)\n",
    "\n",
    "for alumno in aprobados_guardados:\n",
    "    print(alumno[\"nombre\"], alumno[\"nota\"])\n"
   ],
   "id": "48dfa306c948c4ab"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
