{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Ejercicios con ficheros CSV\n",
        "\n",
        "Este notebook permite practicar la lectura, filtrado, modificación y escritura de datos CSV con Python.\n",
        "\n",
        "Ejecuta las celdas en orden, de arriba abajo. Los ejercicios 11, 12 y 13 modifican la lista `alumnos` en memoria.\n",
        "\n",
        "Las funciones y elementos más importantes de la librería csv son:\n",
        "\n",
        "csv.reader(): lee cada fila como una lista.\n",
        "csv.DictReader(): lee cada fila como un diccionario utilizando las cabeceras.\n",
        "csv.writer(): permite escribir filas utilizando listas.\n",
        "csv.DictWriter(): permite escribir filas utilizando diccionarios.\n",
        "writerow(): escribe una única fila.\n",
        "writerows(): escribe varias filas.\n",
        "writeheader(): escribe las cabeceras definidas en fieldnames.\n",
        "\n",
        "También son importantes los modos de apertura:\n",
        "\n",
        "\"r\": leer el CSV.\n",
        "\"w\": crear o sobrescribir el CSV.\n",
        "\"a\": añadir filas al final.\n",
        "open(\"alumnos.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",
        "\n",
        "Y algunos parámetros habituales:\n",
        "\n",
        "delimiter=\";\": indica el separador.\n",
        "fieldnames=campos: define los nombres y el orden de las columnas.\n",
        "newline=\"\": evita líneas vacías adicionales, especialmente en Windows.\n",
        "encoding=\"utf-8\": permite trabajar correctamente con tildes y caracteres especiales."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 1. Importar la librería CSV\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "import csv\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 2. Crear el fichero alumnos.csv\n",
        "\n",
        "Esta celda genera automáticamente el fichero de ejemplo en la misma carpeta que el notebook.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Se ha creado el fichero alumnos.csv\n"
          ]
        }
      ],
      "source": [
        "contenido_csv = \"\"\"id,nombre,edad,curso,nota,activo\n",
        "1,Ane,20,DAM,8.5,True\n",
        "2,Jon,22,DAW,6.7,True\n",
        "3,Maialen,19,DAM,4.2,False\n",
        "4,Unai,21,ASIR,7.8,True\n",
        "\"\"\"\n",
        "\n",
        "with open(\"alumnos.csv\", \"w\", encoding=\"utf-8\", newline=\"\") as fichero:\n",
        "    fichero.write(contenido_csv)\n",
        "\n",
        "print(\"Se ha creado el fichero alumnos.csv\")\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 3. Cargar el fichero CSV\n",
        "\n",
        "`DictReader` utiliza la cabecera del CSV como claves de cada diccionario. Todos los valores se leen inicialmente como texto, por lo que convertimos los campos numéricos y booleanos.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Número de alumnos: 4\n"
          ]
        }
      ],
      "source": [
        "alumnos = []\n",
        "\n",
        "with open(\"alumnos.csv\", \"r\", encoding=\"utf-8\", newline=\"\") as fichero:\n",
        "    lector = csv.DictReader(fichero)\n",
        "\n",
        "    for fila in lector:\n",
        "        fila[\"id\"] = int(fila[\"id\"])\n",
        "        fila[\"edad\"] = int(fila[\"edad\"])\n",
        "        fila[\"nota\"] = float(fila[\"nota\"])\n",
        "        fila[\"activo\"] = fila[\"activo\"] == \"True\"\n",
        "        alumnos.append(fila)\n",
        "\n",
        "print(\"Número de alumnos:\", len(alumnos))\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 1. Mostrar todo el contenido\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "{'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"
          ]
        }
      ],
      "source": [
        "for alumno in alumnos:\n",
        "    print(alumno)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 2. Mostrar solo los nombres\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Ane\n",
            "Jon\n",
            "Maialen\n",
            "Unai\n"
          ]
        }
      ],
      "source": [
        "for alumno in alumnos:\n",
        "    print(alumno[\"nombre\"])\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 3. Mostrar el nombre y la nota\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Ane - 8.5\n",
            "Jon - 6.7\n",
            "Maialen - 4.2\n",
            "Unai - 7.8\n"
          ]
        }
      ],
      "source": [
        "for alumno in alumnos:\n",
        "    print(alumno[\"nombre\"], \"-\", alumno[\"nota\"])\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 4. Mostrar el alumnado aprobado\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Ane\n",
            "Jon\n",
            "Unai\n"
          ]
        }
      ],
      "source": [
        "for alumno in alumnos:\n",
        "    if alumno[\"nota\"] >= 5:\n",
        "        print(alumno[\"nombre\"])\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 5. Mostrar el alumnado de DAM\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Ane\n",
            "Maialen\n"
          ]
        }
      ],
      "source": [
        "for alumno in alumnos:\n",
        "    if alumno[\"curso\"] == \"DAM\":\n",
        "        print(alumno[\"nombre\"])\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 6. Mostrar el alumnado activo\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Ane\n",
            "Jon\n",
            "Unai\n"
          ]
        }
      ],
      "source": [
        "for alumno in alumnos:\n",
        "    if alumno[\"activo\"]:\n",
        "        print(alumno[\"nombre\"])\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 7. Calcular la nota media\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Nota media: 6.8\n"
          ]
        }
      ],
      "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"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 8. Buscar un alumno por nombre\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "{'id': 2, 'nombre': 'Jon', 'edad': 22, 'curso': 'DAW', 'nota': 6.7, 'activo': True}\n"
          ]
        }
      ],
      "source": [
        "nombre_buscar = \"Jon\"\n",
        "\n",
        "for alumno in alumnos:\n",
        "    if alumno[\"nombre\"] == nombre_buscar:\n",
        "        print(alumno)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 9. Buscar al alumno con mayor nota\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Ane 8.5\n"
          ]
        }
      ],
      "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"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 10. Contar alumnos por curso\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "{'DAM': 2, 'DAW': 1, 'ASIR': 1}\n"
          ]
        }
      ],
      "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"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 11. Modificar la nota de un alumno\n",
        "\n",
        "La modificación se realiza inicialmente sobre la lista `alumnos`. Después se reescribe el CSV completo para conservar el cambio.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {},
      "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"
          ]
        }
      ],
      "source": [
        "for alumno in alumnos:\n",
        "    if alumno[\"nombre\"] == \"Maialen\":\n",
        "        alumno[\"nota\"] = 5.5\n",
        "\n",
        "campos = [\"id\", \"nombre\", \"edad\", \"curso\", \"nota\", \"activo\"]\n",
        "\n",
        "with open(\"alumnos.csv\", \"w\", encoding=\"utf-8\", newline=\"\") as fichero:\n",
        "    escritor = csv.DictWriter(fichero, fieldnames=campos)\n",
        "    escritor.writeheader()\n",
        "    escritor.writerows(alumnos)\n",
        "\n",
        "print(alumnos)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 12. Añadir un alumno nuevo\n",
        "\n",
        "Se añade el nuevo diccionario a la lista y también como una nueva fila de `alumnos.csv`.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "metadata": {},
      "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"
          ]
        }
      ],
      "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.csv\", \"a\", encoding=\"utf-8\", newline=\"\") as fichero:\n",
        "    campos = [\"id\", \"nombre\", \"edad\", \"curso\", \"nota\", \"activo\"]\n",
        "    escritor = csv.DictWriter(fichero, fieldnames=campos)\n",
        "    escritor.writerow(nuevo_alumno)\n",
        "\n",
        "print(alumnos)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 13. Eliminar un alumno\n",
        "\n",
        "Para eliminar un registro del CSV se crea una lista sin Jon y se reescribe el fichero completo.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {},
      "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"
          ]
        }
      ],
      "source": [
        "alumnos_filtrados = []\n",
        "\n",
        "for alumno in alumnos:\n",
        "    if alumno[\"nombre\"] != \"Jon\":\n",
        "        alumnos_filtrados.append(alumno)\n",
        "\n",
        "alumnos = alumnos_filtrados\n",
        "campos = [\"id\", \"nombre\", \"edad\", \"curso\", \"nota\", \"activo\"]\n",
        "\n",
        "with open(\"alumnos.csv\", \"w\", encoding=\"utf-8\", newline=\"\") as fichero:\n",
        "    escritor = csv.DictWriter(fichero, fieldnames=campos)\n",
        "    escritor.writeheader()\n",
        "    escritor.writerows(alumnos)\n",
        "\n",
        "print(alumnos)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 14. Crear un CSV solamente con los aprobados\n",
        "\n",
        "Los datos filtrados se guardan en `aprobados.csv`.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Se ha creado el fichero aprobados.csv\n"
          ]
        }
      ],
      "source": [
        "aprobados = []\n",
        "\n",
        "for alumno in alumnos:\n",
        "    if alumno[\"nota\"] >= 5:\n",
        "        aprobados.append(alumno)\n",
        "\n",
        "campos = [\"id\", \"nombre\", \"edad\", \"curso\", \"nota\", \"activo\"]\n",
        "\n",
        "with open(\"aprobados.csv\", \"w\", encoding=\"utf-8\", newline=\"\") as fichero:\n",
        "    escritor = csv.DictWriter(fichero, fieldnames=campos)\n",
        "    escritor.writeheader()\n",
        "    escritor.writerows(aprobados)\n",
        "\n",
        "print(\"Se ha creado el fichero aprobados.csv\")\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Ejercicio 15. Leer un CSV utilizando csv.reader\n",
        "\n",
        "`csv.reader` devuelve cada fila como una lista. `DictReader` devuelve un diccionario y resulta más cómodo cuando el CSV tiene cabeceras.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "['id', 'nombre', 'edad', 'curso', 'nota', 'activo']\n",
            "['1', 'Ane', '20', 'DAM', '8.5', 'True']\n",
            "['3', 'Maialen', '19', 'DAM', '5.5', 'False']\n",
            "['4', 'Unai', '21', 'ASIR', '7.8', 'True']\n",
            "['5', 'Nerea', '23', 'DAW', '9.1', 'True']\n"
          ]
        }
      ],
      "source": [
        "with open(\"alumnos.csv\", \"r\", encoding=\"utf-8\", newline=\"\") as fichero:\n",
        "    lector = csv.reader(fichero)\n",
        "\n",
        "    for fila in lector:\n",
        "        print(fila)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Comprobar el contenido de aprobados.csv\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Ane 8.5\n",
            "Maialen 5.5\n",
            "Unai 7.8\n",
            "Nerea 9.1\n"
          ]
        }
      ],
      "source": [
        "with open(\"aprobados.csv\", \"r\", encoding=\"utf-8\", newline=\"\") as fichero:\n",
        "    lector = csv.DictReader(fichero)\n",
        "\n",
        "    for fila in lector:\n",
        "        print(fila[\"nombre\"], fila[\"nota\"])\n"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": ".venv (3.14.7.final.0)",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.14.7"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}
