Python06

25
PYTHON Lección No. 6 M.Sc. Victor Pando Beltrán [email protected] http://www.civil-uancv.pe/ aulavirtual

description

Creación, carga y lectura de archivos.Captura de excepciones.

Transcript of Python06

Page 1: Python06

PYTHONLección No. 6

M.Sc. Victor Pando Beltrán

[email protected]

http://www.civil-uancv.pe/aulavirtual

Page 2: Python06

AGENDA

Creación, carga y lectura de archivos Captura de excepciones

Page 3: Python06

RECOMENDACIONES

Poner celulares en silencio No conversar mientras el expositor está

dando la charla Si te da sueño, puedes dormir pero sin roncar

:P Si hablo muy rápido favor indicármelo para

hablar más lento

Page 4: Python06

Creación, carga y lectura de archivos de texto (1/8)

Python cuenta con una clase llamada file que nos permite crear, escribir y leer datos de un archivo de texto.

Para crear un objeto de la clase file debemos utilizar la función open. Cuando llamamos a dicha función le pasamos como primer parámetro el nombre del archivo de texto y el modo de apertura del mismo:

open(nombre del archivo,modo)

Si el archivo de texto se encuentra en la misma carpeta que nuestro programa no necesitamos indicar el path (camino). Los modos de apertura del archivo de texto pueden ser:

•'r' Abre el archivo para lectura (debe existir el archivo)•'w' Crea el archivo y lo abre para escribir•'a' Abre el archivo para escribir. Se crea si el archivo no existe. Solo podemos agregar datos al final

Page 5: Python06

Creación, carga y lectura de archivos de texto (2/8)

Creación de un archivo de textoEl siguiente algoritmo crea en disco un archivo de texto llamado 'datos.txt' y no graba datos. Si queremos luego de ejecutar el programa podemos verificar la existencia del archivo en la misma carpeta donde almacenamos nuestro programa.

Cuando lo grabamos el archivo fuente en Python debemos darle un nombre al programa (por ejemplo texto1.py)

def creaciontxt(): archi=open('datos.txt','w') archi.close()

creaciontxt()Creamos una función llamada creaciontxt donde primero llamamos a la función open pasando como parámetros el nombre del archivo de texto a crear y el modo de apertura ('w'). La función open retorna la referencia del objeto file. Luego llamamos al método close de la clase file. Si luego queremos ver si se a creado el archivo de textos podemos hacerlo desde algún explorador de archivos, en la carpeta donde se encuentra nuestro programa en Python veremos un archivo llamado 'datos.txt' con un tamaño de 0 bytes.

Page 6: Python06

Creación, carga y lectura de archivos de texto (3/8)

Grabación de líneas en el archivo de texto

def creartxt(): archi=open('datos.txt','w') archi.close()

def grabartxt(): archi=open('datos.txt','a') archi.write('Linea 1\n') archi.write('Linea 2\n') archi.write('Linea 3\n') archi.close()

creartxt()grabartxt()

Page 7: Python06

Creación, carga y lectura de archivos de texto (4/8)

La función creartxt es similar al ejemplo anterior, y la función grabartxt tiene por objetivo abrir el archivo en modo de agregado. Cada vez que grabamos un string en el archivo de texto insertamos un salto de línea '\n'. Finalmente liberamos el archivo llamando al método close.

Para ver el contenido de nuestro archivo de texto debemos utilizar un editor de texto (bloc de notas o el mismo entorno del Idle nos puede servir para ver el contenido de un archivo txt)

Page 8: Python06

Creación, carga y lectura de archivos de texto (5/8)

Lectura línea a línea de un archivo de textoLa clase file tiene un método llamado readline() que retorna toda una línea del archivo de texto y deja posicionado el puntero de archivo en la siguiente línea.

Cuando llega al final del archivo readline retorna un string vacío.

Page 9: Python06

Creación, carga y lectura de archivos de texto (6/8)

Luego de abrir el archivo para lectura procedemos a leer la primer línea:

archi=open('datos.txt','r') linea=archi.readline()

El while se repite mientras el método readline() no retorne un string vacío. Dentro del while procedemos a imprimir la línea que acabamos de leer y leemos la siguiente (el método readline() retorna el contenido de toda la línea inclusive el salto de línea \n):

while linea!="": print linea linea=archi.readline()

Page 10: Python06

Creación, carga y lectura de archivos de texto (7/8)

Podemos leer todo el contenido de un archivo de texto y almacenarlo en una lista (esto tiene sentido si el archivo de texto no es muy grande):

Page 11: Python06

Creación, carga y lectura de archivos de texto (8/8)

Utilizamos el método readlines() en lugar de readline(). El método readlines() retorna una lista con cada línea del archivo de texto.

Recordemos que podemos procesar luego cada elemento de la lista recorriéndola con una estructura repetitiva:

def leertxtenlista(): archi=open('datos.txt','r') lineas=archi.readlines() for li in lineas: print li archi.close()

Page 12: Python06

Captura de excepciones (1/11)

Cuando nuestra aplicación genera un error que Python no puede resolver podemos disponer un código que se ejecute para dichas situaciones.

Errores como tratar de abrir un archivo que no existe, acceder a un elemento de una lista que no existe, dividir por cero etc. genera un error que hace que nuestro programa se detenga y no continúe su ejecución. Pero con Python podemos prever estas situaciones y definir un algoritmo que se ejecutará excepcionalmente cuando ocurra dicho error.

Si ejecutamos el siguiente código el programa se detendrá informándonos que se produjo un error y no puede continuar:

y=0 x=10/y print 'esta linea nunca se ejecuta'

Page 13: Python06

Captura de excepciones (2/11)

Utilizando excepciones podemos capturar el error y continuar la ejecución del programa:

y=0 try:

x=10/y except ZeroDivisionError:

print 'No existe la division por cero' print 'Esta línea si se ejecuta'

La estructura try/except requiere que indiquemos el tipo de excepción a capturar, en este caso cuando se trata de dividir por cero Python genera una excepción llamada ZeroDivisionError. Para capturar dicha excepción debemos disponerla seguido de la palabra clave except.

Si se produce la excepción se ejecutan las instrucciones que dispongamos en las líneas siguientes al except.

Page 14: Python06

Captura de excepciones (3/11)

Cuando se captura una excepción el programa no se detiene y continua con las instrucciones siguientes al bloque try/except.

Veamos otro ejemplo de intentar acceder a un elemento que no existe en una lista:

lista1=['juan','ana','carlos'] try: print lista1[5] except IndexError: print 'Intenta acceder a un elemento no existente a la lista'

lista1 almacena 3 elementos y tratamos de acceder al de la posición 5. Python en esta situación genera una excepción de tipo IndexError, como disponemos el acceso dentro de la construcción try/except y captura el tipo de excepción IndexError el programa no se detiene y ejecuta la instrucción seguida de la línea except IndexError.

Page 15: Python06

Captura de excepciones (4/11)

Un tema de aplicación muy común donde se utilizan las excepciones es con el tratamiento de archivos, hay muchas situaciones que pueden generar excepciones en estos casos como puede ser que no se pueda abrir un archivo porque no existe, no lo pueda crear porque la unidad de almacenamiento está llena, el archivo se encuentra bloqueado por otro programa etc.

El código para crear, grabar y leer un archivo capturando las excepciones queda de la siguiente manera:

Page 16: Python06

Captura de excepciones (5/11)

La excepción cumple un doble cometido en estas situaciones, primero mostramos mensajes que nosotros definimos y no los que Python muestra por defecto cuando se genera un error y por otro lado podemos continuar con la ejecución de nuestro algoritmo sin que se detenga.

Podemos disponer varias capturas de excepciones para un bloque try:

lista1=['juan','ana','carlos']try: print lista1[0] z=10/0except IndexError: print 'Intenta acceder a un elemento no existente a la lista'except ZeroDivisionError: print 'Division por cero no permitida'

Page 17: Python06

Captura de excepciones (6/11)

En este bloque try capturamos las excepciones de tipo: IndexError y ZeroDivisionError. Como podemos ver la que se dispara es la de ZeroDivisionError. Pero podemos generar el otro tipo de excepción modificando la línea de impresión del elemento de la lista:

print lista1[5]

Si hacemos este cambio se ejecuta la sección seguida a 'except IndexError:'.

Una vez disparada dicha excepción no continua con las instrucciones del bloque del try, es decir no generará la excepción de división por cero, pero si continuará con el flujo del algoritmo.

Page 18: Python06

Captura de excepciones (7/11)

Si no queremos tratar los errores en forma independiente podemos agrupar excepciones:

lista1=['juan','ana','carlos']try: print lista1[0] z=10/0except (IndexError,ZeroDivisionError): print 'Se produjo un error'

Debemos indicar entre paréntesis todas las excepciones a capturar y como se procede con ellas, en este caso solo se muestra un mensaje 'Se produjo un error'.

Page 19: Python06

Captura de excepciones (8/11)

Otra parte opcional de un bloque try es la del else. Este bloque se ejecuta si no se produce la excepción:

lista1=['juan','ana','carlos']try: print lista1[0] z=10/5except (IndexError,ZeroDivisionError): print 'Se produjo un error'else: print z

Este programa muestra el primer elemento de la lista, luego procede a inicializar la variable z con el valor 10/5 y seguidamente ejecuta la sección del else ya que no se a generado excepciones. Podemos tratar de imprimir una componente que no exista de la lista y veremos que no se ejecuta el bloque del else.

Page 20: Python06

Captura de excepciones (9/11)

Hemos visto que podemos capturar distintas excepciones en forma independiente:

except IndexError: print 'Intenta acceder a un elemento no existente a la lista'except ZeroDivisionError: print 'Division por cero no permitida'

En forma conjunta:

except (IndexError,ZeroDivisionError): print 'Se produjo un error'

Page 21: Python06

Captura de excepciones (10/11)

Inclusive Python nos permite disponer un bloque try except para la captura de cualquier tipo de excepción (si bien esto no es lo más recomendable ya que es difícil emprender una acción para todos los tipos de errores que pueden generarse):

lista1=['juan','ana','carlos']try: print lista1[0] z=10/0except: print 'Se produjo un error'

Page 22: Python06

Captura de excepciones (11/11)

Otra sección que puede tener un bloque try except es finally.finally permite disponer un bloque de código que se ejecutará siempre, indistintamente se produzca o no la excepción. El objetivo de esta sección es generalmente utilizado para liberar recursos como puede ser cerrar la conexión con una base de datos o cerrar un archivo.

try: z=10/0 print 'Esto no se ejecuta'except: print 'Se produjo un error'finally: print 'Siempre se ejecuta'

Page 23: Python06

Problema resuelto

Definir una diccionario donde se debe almacenar los nombres de frutas como clave y su precio como valor. Tratar de acceder a una clave inexistente y capturar la excepción KeyError que se produce en estos casos.

frutas={'naranjas':1.5,'manzanas':2.3,'peras':1.5}try: print frutas['sandias'] except KeyError: print 'No existe dicha fruta'

Page 24: Python06

BIBLIOGRAFÍA

Página personal de Guido van Rossum Libro texto del curso Sitio principal de Python Zona de descarga de Python Página principal de VPython Zona de descarga de VPython

Page 25: Python06