Módulo 3: Trabajo con archivos y manejo de errores

Tema 10: Lectura/Escritura de Archivos de Texto y CSV

Objetivo del tema:

Aprender a trabajar con archivos externos en Python, incluyendo:

  • Archivos de texto plano (.txt)
  • Archivos CSV (valores separados por comas)

1. Lectura y Escritura de Archivos de Texto

Abrir un archivo con open()

Siempre es importante cerrar el archivo después de usarlo, o usar with.

Mejor forma: with

Modos de apertura más comunes:

  • 'r': lectura
  • 'w': escritura (sobrescribe)
  • 'a': añadir contenido al final
  • 'x': crea nuevo archivo (falla si ya existe)

Escribir en un archivo

Leer línea por línea

2. Lectura y Escritura de Archivos CSV

Python ofrece el módulo estándar csv para trabajar con archivos .csv.

Leer archivo CSV

Leer con cabecera (como diccionario)

Escribir archivo CSV

Escribir con diccionarios

3. Buenas prácticas

  • Usa siempre with para abrir archivos.
  • Controla excepciones con try/except.
  • Usa newline='' para evitar líneas en blanco en Windows.
  • Codificación recomendada: encoding='utf-8'.

Actividades sugeridas

  1. Crear un archivo de texto con una lista de tareas y luego leerlo desde Python.
  2. (CASA) Leer un archivo .csv con datos de productos y calcular el precio total de cada uno.
  3. (CASA) Escribir un nuevo archivo .csv con los resultados anteriores.
  4. (CASA) Escribir un programa que pida por consola los datos de varias personas (nombre, edad) y los guarde en un archivo CSV.
  5. (CASA) Leer un archivo de texto línea por línea y contar cuántas líneas contienen una palabra clave dada.

Tema 11: Manejo de errores con try, except, finally

Objetivo del tema:

Aprender a detectar, capturar y gestionar errores en tiempo de ejecución para evitar que el programa se bloquee y garantizar un comportamiento seguro y controlado.

1. ¿Qué es una excepción?

Una excepción es un error que ocurre durante la ejecución del programa. Si no se maneja, Python interrumpe el programa y muestra un mensaje de error.

Ejemplo:

Si el usuario introduce 0 o algo no numérico, el programa fallará.

2. Estructura básica: try y except

3. Múltiples excepciones

4. Bloque else

Se ejecuta solo si no hay errores.

5. Bloque finally

Se ejecuta siempre, haya o no error. Ideal para cerrar archivos, liberar recursos, etc.

Las excepciones más comunes de Python se recogen, con ejemplos, en la tabla del Tema 12.

6. Capturar más de una excepción en una sola línea

Se pueden capturar varias excepciones de ser necesario:

7. Capturar cualquier excepción

No es recomendable, pero útil en algunos casos:

8. Lanzar tus propias excepciones con raise

Hasta ahora hemos capturado errores; también puedes provocarlos tú mismo con raise cuando detectes una situación inválida. Así avisas de un problema en vez de dejar que el programa siga con datos incorrectos.

Puedes lanzar cualquier excepción estándar (ValueError, TypeError, etc.). Para casos propios de tu programa, crea tu propia excepción heredando de Exception:

Actividades sugeridas

  1. Crear un programa que divida dos números y maneje:
  • División por cero
  • Entrada no numérica
  1. Leer un archivo y mostrar error si no existe.
  2. Crear una función que abra un archivo, lea contenido y lo devuelva, asegurando que siempre se cierre el archivo.
  3. Simular un pequeño sistema de login donde se capturen errores si falta el archivo de usuarios o si los datos no son válidos.
  4. (CASA) Ampliar el mini-proyecto de la calculadora (del Módulo 1) con manejo de errores.

Tema 12: Uso de with, excepciones comunes

Objetivo del tema:

  • Comprender el uso de la sentencia with para la gestión automática de recursos.
  • Conocer y reconocer las excepciones más comunes en Python para prevenir errores y manejarlos de forma eficaz.

1. Uso del bloque with

El bloque with se usa para gestionar contextos en los que se necesita abrir y cerrar recursos, como archivos, conexiones o recursos externos, sin necesidad de cerrar manualmente.

Ventajas:

  • Cierre automático del recurso.
  • Código más limpio y seguro.
  • Evita olvidarse de close() o de limpiar recursos.

Sintaxis general

Ejemplo con archivos

2. ¿Cómo funciona internamente?

El bloque with usa un context manager, que gestiona la apertura y el cierre de recursos.

Equivale a:

3. Excepciones comunes en Python

Conocer estas excepciones es útil para anticipar errores en el código y aplicar try/except de forma efectiva.

Excepción Descripción Ejemplo desencadenante
ZeroDivisionError División entre cero 10 / 0
ValueError Conversión inválida entre tipos int("abc")
TypeError Operación con tipos incompatibles "hola" + 3
IndexError Índice fuera de rango en una lista o tupla lista[10]
KeyError Clave inexistente en un diccionario diccionario["clave_invalida"]
FileNotFoundError Archivo inexistente open("inexistente.txt")
AttributeError Acceso a un atributo que no existe "hola".inexistente
NameError Uso de una variable no definida print(variable_no_definida)

Actividades prácticas

  1. Crear un programa que abra un archivo usando with y muestre su contenido.
  2. Modificar un archivo existente sin sobrescribirlo, usando with y el modo 'a'.
  3. Crear un pequeño script que capture varias excepciones comunes como IndexError, TypeError, y ValueError.
  4. Crear un diccionario de usuarios y probar accesos seguros con manejo de KeyError.
  5. Crear una función que reciba una ruta de archivo y devuelva su contenido, gestionando errores con try/except y with.

Tema 13: Estructuración de proyectos

Objetivo:

Aprender cómo dividir el código Python en varios archivos (módulos), importar funciones y clases desde otros scripts, y entender el uso de la instrucción especial if __name__ == "__main__": para controlar qué partes del código se ejecutan al importar o ejecutar un script.

1. Introducción a los módulos en Python

En Python, cada archivo .py es un módulo. Podemos importar el contenido de un archivo en otro para reutilizar código.

Esto permite:

  • Organizar mejor los programas grandes.
  • Reutilizar funciones y clases en distintos proyectos.
  • Mantener el código más limpio y modular.

Ejemplo básico

Archivo: saludos.py

Archivo: principal.py

2. Formas de importar

Python permite varias formas de importación:

import saludos # Importa todo el módulo

Consejo: usar alias o importaciones específicas mejora la legibilidad y evita conflictos de nombres.

3. La variable especial __name__

Python asigna automáticamente una variable especial llamada __name__ a todos los archivos .py.

  • Si el archivo se ejecuta directamente, __name__ toma el valor "__main__".
  • Si el archivo se importa en otro, __name__ toma el nombre del módulo.

Podemos usar esto para decidir qué partes del código se ejecutan.

Ejemplo práctico

Archivo: saludos.py

Al ejecutar python saludos.py mostrará:

Este código siempre se ejecuta
Este código SOLO se ejecuta si este archivo se ejecuta directamente

Al importar en otro archivo:

Salida:

Este código siempre se ejecuta

La parte dentro de if __name__ == "__main__": no se ejecuta.

4. Uso típico: definir una función main()

Para programas más grandes, se suele definir una función principal y controlarla así:

Esto mejora la legibilidad y permite usar el archivo tanto como programa ejecutable como módulo reutilizable.

5. Organización de proyectos

Estructura recomendada para proyectos pequeños:

mi_proyecto/
    │
    ├── main.py
    ├── utilidades.py
    ├── calculos.py
    └── datos/
    └── archivo.csv
  • main.py → punto de entrada (usa if __name__ == "__main__")
  • utilidades.py → funciones auxiliares
  • calculos.py → lógica del programa
  • datos/ → ficheros y recursos

Resumen del tema

Concepto Descripción
Módulo Archivo .py que puede importarse en otros scripts.
Importación Permite usar funciones y clases de otro archivo.
__name__ Variable interna que indica si el archivo fue ejecutado directamente o importado.
if __name__ == "__main__" Permite ejecutar código solo cuando el archivo se ejecuta directamente.
Estructura modular Mejora la organización y reutilización del código.

Actividades y ejercicios prácticos

Ejercicio 1: Modularización básica

  1. Crea un archivo llamado operaciones.py con las funciones:

def sumar(a, b): return a + b

  1. Crea un segundo archivo main.py que importe esas funciones y las use para realizar operaciones con dos números introducidos por el usuario.

Ejercicio 2: Uso de if __name__ == "__main__"

  1. En el archivo operaciones.py, añade:

if __name__ == "__main__":

  1. Observa qué ocurre al ejecutar directamente operaciones.py y qué ocurre al importarlo desde main.py.

Ejercicio 3: Mini proyecto

Objetivo: Crear una pequeña aplicación modular que gestione una lista de tareas.

Estructura:

gestor_tareas/
    │
    ├── main.py
    ├── tareas.py
    └── utilidades.py
  • tareas.py: funciones para añadir, eliminar y mostrar tareas.
  • utilidades.py: funciones auxiliares como guardar y leer tareas desde un archivo.
  • main.py: contiene if __name__ == "__main__" y ejecuta el menú principal del programa.

Entrega sugerida para el ejercicio 3:

  • Código fuente en varios archivos .py organizados.
  • Captura o salida de la ejecución del programa.
  • Breve explicación (máx. 5 líneas) del papel de if __name__ == "__main__" en el proyecto.