16.01.2014 Views

Cuarto día (PDF, 900 KB)

Cuarto día (PDF, 900 KB)

Cuarto día (PDF, 900 KB)

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Logo<br />

IAA-CSIC<br />

Curso<br />

organizado por<br />

el Gabinete de<br />

Formación del<br />

CSIC<br />

Curso de Python Inicial<br />

Librería estándar


Contenidos<br />

¿Qué es?<br />

¿Para qué sirve?<br />

¿Cómo se usa?<br />

¿Qué incluye?<br />

• Interfaz con el sistema operativo<br />

• Matemáticas<br />

• Ficheros y directorios<br />

• Búsqueda de patrones<br />

• Fechas y horas<br />

• Redirección de entrada salida y terminación de programas<br />

• Persistencia<br />

• Rutas<br />

• Multiproceso<br />

• Compresión<br />

• Generación de números aleatorios<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 2


¿Qué es?<br />

• La librería estándar contiene varios tipos de<br />

componentes.<br />

– Tipos de datos que pueden ser considerados como parte<br />

del núcleo de Python (números y listas).<br />

– Funciones internas y excepciones.<br />

– La mayor parte de la librería está constituida por un amplio<br />

conjunto de módulos que permiten expandir la<br />

funcionalidad de Python.<br />

• Se distribuye junto con el intérprete.<br />

• Con cada nueva versión de Python, se mejora y amplía<br />

la funcionalidad.<br />

http://docs.python.org/library/index.html<br />

10/04/2013<br />

César Husillos<br />

Víctor Terrón<br />

3


¿Para qué sirve?<br />

• Lo que hace diferente a Python de otros lenguajes de alto<br />

nivel es, además de su sencillez, su librería estándar.<br />

• Los cientos de módulos que implementa lo hacen portable<br />

a cualquier ordenador (aunque ciertamente algunos son<br />

dependientes del Sistema Operativo) .<br />

• La librería es de propósito general: sirve para cualquier<br />

desarrollo.<br />

• Gran parte de nuestro trabajo está ya hecho<br />

(REUTILIZACIÓN).<br />

• Los módulos ya han sido probados.<br />

• El tiempo que invirtamos en leer la documentación lo<br />

recuperaremos con creces cuando programemos<br />

aplicaciones.<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

4


¿Cómo se usa?<br />

• Lo difícil es no perderse en la maraña de módulos<br />

existentes.<br />

• Tras localizar el módulo que creemos que nos<br />

sirve para nuestra tarea, simplemente lo<br />

importamos a nuestro espacio de trabajo y<br />

utilizamos lo que necesitamos.<br />

• Visite la web<br />

http://docs.python.org/py-modindex.html<br />

Para echar un vistazo rápido a los módulos de la<br />

librería.<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

5


Módulo sys<br />

USO DEL SISTEMA OPERATIVO<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 6


Módulo sys<br />

Ya son conocidas sus capacidades para la gestión<br />

de parámetros de entrada a scripts Python<br />

– propiedad argv<br />

También se ha utilizado para modificar la ruta de<br />

búsqueda de módulos Python<br />

– propiedad path<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

7


Módulo sys: Forzar fin de ejecución<br />

Aunque no es programación de estilo, supongamos<br />

que, en un momento dado,<br />

• bien porque el script tarda demasiado en<br />

ejecutarse,<br />

• O porque se da cierta condición crítica,<br />

necesitamos terminar la ejecución de un script.<br />

sys.exit([status])<br />

donde status es un entero que sirve para<br />

informar del motivo de la finalización.<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

8


Módulo sys: Forzar fin de ejecución.<br />

Ejemplo.<br />

Fichero: salida.py<br />

import sys<br />

if len(sys.argv) < 2:<br />

sys.exit(1)<br />

print sys.argv[1:]<br />

Desde el intérprete<br />

>>> import sys<br />

>>> import subprocess<br />

>>> subprocess.call(['p<br />

ython', 'salida.py'])<br />

1<br />

>>> subprocess.call(['p<br />

ython', 'salida.py', 'p<br />

arametro'])<br />

['parametro']<br />

0<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

9


Módulo sys: Forzar fin de ejecución.<br />

Ejemplo (II).<br />

También sirve para salir del intérprete<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

10


Módulo sys: Redirección de<br />

entrada/Salida<br />

Ejecutamos un script y nos vamos a tomar un café. Al<br />

regresar vemos por pantalla el resultado. (Lo normal)<br />

• ¿Y si quiero ejecutar varios de forma secuencial (o<br />

simultánea)?.<br />

– Las salidas por pantalla se mezclarán o serán demasiado<br />

largas para registrarse totalmente en la consola.<br />

• En otras ocasiones puede ejecutar programas que<br />

pidan información de forma interactiva para poder<br />

llevar a cabo sus tareas.<br />

– ¿Tengo que estar presente para la interacción?<br />

Solución: redirección<br />

sys.stdin, sys.stdout, sys.stderr<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

11


Módulo sys: Redirección de<br />

entrada/Salida. Ejemplo.<br />

>>> import sys<br />

>>> out = sys.stdout<br />

>>> fout = open(‘saludo.out', 'w')<br />

>>> sys.stdout = fout<br />

>>> print ‘Hola mundo’<br />

>>> sys.stdout = out<br />

>>> fout.close()<br />

>>> print ‘Hola mundo’<br />

‘Hola mundo’<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

12


Módulo sys: Redirección de<br />

entrada/Salida. Ejemplo (II).<br />

Abrimos con el block de notas el fichero<br />

saludo.out y encontramos:<br />

Hola mundo<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

13


EJERCICIOS: 1 Y 2<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 14


Módulo subprocess<br />

PROCESOS<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 15


Ejecución de Procesos<br />

Python se ha hecho popular por varias razones:<br />

• Sintaxis simple y legible.<br />

• Librerías estándar.<br />

• Gran cantidad de módulos disponibles para trabajo en<br />

ciencia, ingeniería, comunicaciones, …<br />

• Fácil integración con otros lenguajes.<br />

• Abundante documentación.<br />

• Como lenguaje “pegamento” ya que, entre otras cosas,<br />

permite el control de parámetros en la ejecución de<br />

“programa externos”.<br />

Esto último es extremadamente sencillo mediante el uso del<br />

módulo subprocess.<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

16


Ejecución de Procesos: call<br />

subrocess.call (comando [,<br />

shell=False, stdin=None, stdout=None, stderr=None])<br />

• Comando, es la orden a ejecutar. Puede ser una lista o una cadena.<br />

• stdin / stdout / stderr, son objetos fichero que representan a la entrada estándar, salida estándar y salida<br />

de error estándar<br />

– stdin, es la entrada estándar (teclado). También podrá ser un objeto fichero abierto en modo lectura del que se llerán los parámetros<br />

de entrada que necesite el script.<br />

– stdout y stderr, serán la salida estándar y salida estándar de mensajes de error. Pueden ser además, objetos ficheros abiertos en<br />

modo escritura donde se almacenará cualquier ‘print’ realizado en el código y cualquier mensaje de error (excepción) lanzado por<br />

nuestro programa.<br />

• shell, es el formato del comando.<br />

– shell = False, como lista<br />

– shell = True, como cadena de caracteres.<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

17


Ejecución de Procesos. Ejemplo.<br />

● shell = False<br />

>>> import subprocess<br />

>>> subprocess.call([‘python', ‘saludo.py ', ’mundo’])<br />

>>> Hola mundo<br />

● shell = True<br />

>>> subprocess.call(‘python saludo.py mundo’)<br />

>>> Hola mundo<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

18


Ejecución de Procesos.<br />

Salida a fichero<br />

Queremos que la salida de un programa llamado<br />

con subprocess.call se escriba en un fichero<br />

>>> fd = open (‘fichero_salida’, ‘w’)<br />

>>> subprocess.call([‘python', ‘saludo.py ', ’mundo’], stdout = fd)<br />

>>> fd.close ()<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 19


EJERCICIOS: 3 Y 4<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 20


Módulo datetime<br />

TRABAJO CON FECHAS Y HORAS<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 21


Horas y Fechas<br />

• En ocasiones necesito saber la hora a la que se<br />

ejecutó un script y/o el tiempo transcurrido.<br />

• A veces necesito saber el intervalo temporal<br />

entre dos fechas.<br />

• Quizá necesite parar la ejecución de un<br />

programa tras un intervalo de tiempo de espera<br />

(una petición web sin respuesta).<br />

• Todo esto y más se puede realizar con el módulo<br />

datetime<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

22


Horas y Fechas: Módulos<br />

Clases del<br />

módulo<br />

datetime<br />

date, time, datetime, timedelta<br />

Se pueden<br />

crear objetos<br />

mediante sus<br />

constructores<br />

O se pueden<br />

crear a partir<br />

de la fecha y<br />

hora del<br />

sistema:<br />

datetime.date(año, mes, dia)<br />

datetime.time(hora[, minuto[, segundo[, microsegundo[, tzinfo]]]])<br />

datetime.datetime(año, mes, dia[, hora[, minuto[, segundo[, microsegundo[, tzinfo]]]]])<br />

datetime.timedelta([dias[, segundos[, microsegundos[, millisegundos[, minutos[, horas[, semanas]]]]]]])<br />

datetime.date.today()<br />

datetime.datetime.now([tz])<br />

datetime.datetime.combine(fecha, hora)<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

23


Horas y fechas: atributos<br />

• Dato tipo datetime.datetime<br />

– year, month, day, hour, minute, second,<br />

microsecond<br />

• Dato tipo datetime.time<br />

– hour, minute, second, microsecond<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 24


Horas y Fechas:<br />

Creación alternativa<br />

Podemos crear objetos tipo datetime.time y<br />

datetime.date a partir de objetos datetime.datetime<br />

>>> import datetime<br />

>>> now = datetime.datetime.now()<br />

>>> d = now.date()<br />

>>> t = now.time()<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 25


Horas y Fechas: Operaciones<br />

Podemos realizar operaciones con fechas.<br />

Operación Operador Ejemplo<br />

Suma + t1 + t2<br />

Resta - t1 – t2<br />

Comparaciones ==, !=, = t1 < t2<br />

El resultado es un objeto del tipo timedelta.<br />

Atributos de timedelta: days, seconds y<br />

microseconds.<br />

Métodos de timedelta: total_seconds ()<br />

Entonces, estaríamos en condiciones de determinar, por<br />

ejemplo, la duración de nuestros programas o de fragmentos<br />

de código que sospechamos que ralentizan la ejecución.<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

26


Horas y Fechas: Ejemplo<br />

Tiempo que tardo en ejecutar unas instrucciones<br />

>>> import datetime<br />

>>> import time<br />

>>> date1 = datetime.datetime.now()<br />

# Esperamos unos segundos…<br />

>>> date2 = datetime.datetime.now()<br />

>>> datediff = date2 - date1<br />

>>> datediff.days, datediff.seconds,<br />

datediff.microseconds<br />

(0, 15, 829942)<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

27


EJERCICIOS: 5<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 28


Módulos os y shutil<br />

FICHEROS Y DIRECTORIOS<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 29


Ficheros y directorios<br />

• ¿Cómo obtengo el directorio en el que estoy<br />

ejecutando órdenes en un script o intérprete?<br />

• ¿Cómo creo y borro directorios y ficheros?<br />

• ¿Cómo accedo al contenido de un directorio?<br />

• ¿Cómo copio, muevo o borro un fichero?¿Cómo<br />

realizo esas operaciones de forma recursiva sobre<br />

un directorio?<br />

Todo esto y más con los módulos<br />

os y shutil<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

30


Directorio de trabajo<br />

Método getcwd () del módulo os<br />

• Devuelve el directorio actual de trabajo<br />

Método chdir () del módulo os<br />

• Cambia el directorio de trabajo<br />

>>> import os<br />

>>> os.getcwd()<br />

‘E:\\presentaciones\\pyhon_inicial\\codigo'<br />

>>> os.getcwd()<br />

‘C:\\'<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

31


Directorios: Crear<br />

Ejemplo:<br />

os.mkdir (path)<br />

• crea el directorio 'path'.<br />

os.makedirs (path)<br />

• crea recursivamente los subdirectorios<br />

necesarios para generar 'path'.<br />

>>> os.mkdir ('pruebaDir')<br />

>>> os.mkdir ('pruebaDir\\subdir1\\subdir1_1')<br />

Traceback (most recent call last):<br />

File "", line 1, in <br />

OSError: [Errno 2] No such file or directory:<br />

'pruebaDir\\subdir1\\subdir1_1'<br />

>>> os.makedirs ('pruebaDir\\subdir1\\subdir1_1')<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 32


Directorios: Eliminar<br />

os.rmdir(path)<br />

• borra el directorio 'path'. Da error si no está vacío.<br />

os.removedirs(path)<br />

• borrado recursivo de subdirectorios hasta eliminar<br />

el directorio base de 'path'. Lanza OSError si no<br />

consigue su objetivo.<br />

>> import os<br />

>>> os.rmdir('pruebaDir\\subdir1\\subdir1_1')<br />

Traceback (most recent call last):<br />

File "", line 1, in <br />

OSError: [Errno 39] Directory not empty: 'pruebaDir\\subdir1\\subdir1_1'<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

33


Directorios: Copiar<br />

Usamos la función copytree del módulo shutil.<br />

shutil.copytree(origen, destino[, symlinks = False])<br />

• Copia recursivamente el contenido del directorio 'origen',<br />

en 'destino'.<br />

• El directorio de destino NO DEBE existir.<br />

• Se creará 'destino', así como los directorios necesarios<br />

hasta llegar hasta la ruta dada.<br />

• Si symlinks = False, se copian los enlaces simbólicos. Si es<br />

True, se copia el contenido enlazado en el nuevo<br />

directorio.<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

34


En el intérprete...<br />

>>> import shutil<br />

Directorios: Copiar.<br />

>>> shutil.copytree ('E:\\presentaciones\\python_inicial\\codigo',<br />

'E:\\presentaciones\\python_inicial\\codigo_backup')<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

35


Directorios: Renombrar<br />

Usamos la función rename del módulo os.<br />

Falla cuando destino existe.<br />

os.rename(origen, destino)<br />

>>> os.rename('pruebaDir', 'probeDir')<br />

Sirve también para ficheros. En este caso, si destino existe, lo reemplazará<br />

si se dispone de permisos.<br />

>>> os.rename('probeDir\\subdir1\\subdir1_1\\readme',<br />

'probeDir\\subdir1\\subdir1_1\\README')<br />

donde se tiene ahora<br />

C:\presentaciones\python_inicial><br />

dir probeDir\subdir1\subdir1_1\<br />

02/03/2012 12:13 303 README<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

36


Directorios: Contenido<br />

• os.listdir(path)<br />

Devuelve una lista no ordenada de nombres y directorios contenidos en 'path'.<br />

• os.walk(path)<br />

Proporciona todos los nombres de ficheros y directorios que cuelgan del<br />

directorio 'path'.<br />

>>> for i in os.walk ('E:\\presentaciones\\python_inicial\\ejercicios'):<br />

print i<br />

('E:\\presentaciones\\python_inicial\\ejercicios', [], ['ejercicio1.py',<br />

'ejercicio2.py', 'ejercicio3.py', 'ejercicio4.py', 'ejercicio_noplanteado.py'])<br />

Para cada directorio encontrado a partir de 'path' produce una tupla<br />

(directorio, subdirectorios, ficheros)<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

37


Directorios: Contenido. Ejemplo<br />

Partimos de la estructura de<br />

ficheros<br />

probeDir -- subdir1 -- subdir1_1-- README<br />

|-- subdir2 --- file1.txt<br />

|-- file2.txt<br />

|-- file3.txt<br />

Ejecuto ambos métodos:<br />

>>> import os<br />

>>> os.listdir('probeDir')<br />

['subdir2', 'subdir1']<br />

>>> for path in os.walk('probeDir'):<br />

... print path<br />

...<br />

('probeDir', ['subdir2', 'subdir1'], [])<br />

('probeDir\\subdir2', [], ['file2.txt', 'fil<br />

e1.txt', 'file3.txt'])<br />

('probeDir\\subdir1', ['subdir1_1'], [])<br />

('probeDir\\subdir1\\subdir1_1', [],<br />

['README'])<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

38


Ficheros: Copia y Borrado<br />

• shutil.copy(origen, destino)<br />

Copia, además, todos los permisos de un fichero a otro.<br />

>>> import shutil<br />

>>> shutil.copy('pyregion1.0.1.tar.gz', 'pyregion1.0.1.copy.tar.gz')<br />

• os.remove(path)<br />

Borra el fichero dado por path<br />

>>> import os<br />

>>> os.remove('pyregion1.0.1.copy.tar.gz')<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

39


Ficheros: Mover<br />

• os.rename(viejo, nuevo)<br />

Ya vista en el caso de renombrado de directorios.<br />

• shutil.move(origen, destino)<br />

Mueve recursivamente un fichero o un directorio 'origen' a 'destino'.<br />

>>> import shutil<br />

>>> shutil.move('pyregion1.0.1.tar.gz',<br />

‘C:\\Users\\cesar\\Documents')<br />

>>> (Ctrl+D) # salimos del intérprete<br />

C:\> dir C:\Users\cesar\Documents\*.tar.gz<br />

C:\Users\cesar\Documents\pyregion1.0.1.tar.gz<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

40


Módulo os.path<br />

MANEJO DE RUTAS<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 41


Rutas<br />

• Dada una ruta, ¿cómo separo el nombre del fichero y su<br />

directorio?<br />

• Necesito la extensión de un fichero, ¿cómo?<br />

• Dado un fichero, ¿cómo determino la ruta absoluta?<br />

• ¿Cómo creo una nueva ruta a partir de rutas parciales?<br />

• Necesito comprobar que la ruta a un fichero o directorio<br />

existe<br />

• ¿Cómo sé si una ruta es un fichero o un directorio?<br />

• Necesito conocer el tamaño que ocupa un fichero.<br />

¿Cómo?<br />

Todo lo que necesitamos está en el módulo<br />

os.path<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

42


Rutas: Separar directorio y nombre<br />

• os.path.split (ruta)<br />

Esta función descompone 'ruta' en forma de tupla de dos<br />

elementos: (directorio, nombre)<br />

>>> import os.path<br />

>>> os.path.splitext<br />

(‘C:\\Users\\cesar\\curso_python\\herencia.py’)<br />

(‘C:\\Users\\cesar\\curso_python’, ‘herencia.py’)<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

43


Rutas: Extensión de un fichero<br />

• os.path.splitext (ruta)<br />

Esta función descompone 'ruta' en forma de tupla de dos elementos:<br />

(ruta2, extension)<br />

donde 'ruta2' contiene 'ruta' hasta el último punto que corresponde a<br />

la extensión.<br />

Ejemplo:<br />

>>> import os.path<br />

>>> os.path.splitext<br />

('C:\\Users\\cesar\\curso_python\\herencia.py')<br />

('C:\\Users\\cesar\\curso_python\\herencia', '.py')<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

44


Rutas: Ruta absoluta<br />

• os.path.abspath (path)<br />

Esta función obtiene la ruta absoluta ‘path’. Es equivalente<br />

concatenar la ruta absoluta del directorio actual con ‘path’.<br />

Ejemplo:<br />

>>> import os.path<br />

>>> os.path.abspath ('herencia.py')<br />

'C:\\Python27\\herencia.py'<br />

>>> import os<br />

>>> os.getcwd ()<br />

'C:\\Python27'<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

45


Rutas: Concatenación<br />

os.path.join (directorio, nombre)<br />

Esta función compone y devuelve una nueva ruta<br />

dada por<br />

directorio + nombre.<br />

Ejemplo:<br />

>>> os.path.join ('D:\\directorio_base\dir1',<br />

'dir2\\fichero.extension')<br />

'D:\\directorio_base\\dir1\\dir2\\fichero.<br />

extension'<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

46


Rutas: Validación<br />

• os.path.exists (ruta)<br />

Si la ruta especificada por el parámetro existe, devuelve True. Si no<br />

existe, devuelve False.<br />

Ejemplo:<br />

>>> import os<br />

>>> os.path.exists<br />

('D:\\directorio_base\\dir1\\dir2\\fichero.extension')<br />

False<br />

>>> os.path.exists ('C:\\Users')<br />

True<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

47


Rutas: ¿Directorio o fichero?<br />

os.path.isdir (ruta)<br />

• Si la ruta especificada por el parámetro corresponde a un<br />

directorio, devuelve True. Si no existe, devuelve False.<br />

• Sigue enlaces simbólicos.<br />

os.path.isfile (ruta)<br />

• Si la ruta especificada por el parámetro corresponde a un<br />

fichero, devuelve True. Si no existe, devuelve False.<br />

• Sigue enlaces simbólicos.<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

48


Rutas: ¿Directorio o fichero?. Ejemplo.<br />

>>> import os<br />

>>> os.path.isdir ('C:\\Users')<br />

True<br />

>>> os.path.isfile ('C:\\Users')<br />

False<br />

>>> os.path.isdir ('C:\\Python27\\README.txt')<br />

False<br />

>>> os.path.isfile ('C:\\Python27\\README.txt')<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 49


Rutas: Propiedades de ficheros<br />

• os.path.getsize (ruta)<br />

Devuelve el tamaño en bytes del fichero referenciado por 'ruta'.<br />

Ejemplo:<br />

>>> import os<br />

>>> os.path.getsize ('C:\\Python27\\README.txt')<br />

54967L<br />

(1 kilobyte (<strong>KB</strong>) = 1024 bytes (B))<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

50


Módulo glob<br />

RUTAS: BÚSQUEDAS APROXIMADAS<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 51


Rutas: Búsquedas aproximadas<br />

Usaremos la función glob del módulo glob.<br />

glob.glob (pathmodel)<br />

Busca ficheros que verifique el patrón 'pathmodel'.<br />

El módulo glob reproduce la sintaxis de caracteres<br />

comodín de la shell.<br />

Comodín<br />

Descripción<br />

* Reemplaza a 0 o muchos caracteres<br />

? Reemplaza a un carácter simple<br />

[caracteres]<br />

Reemplaza a cualquiera de los caracteres dentro de los corchetes<br />

[!caracteres]<br />

Reemplaza a cualquiera de los caracteres excepto los dados<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

52


Rutas: Búsquedas aproximadas.<br />

Ejemplo<br />

>>> import glob<br />

>>> glob.glob ('C:\\Python27')<br />

['C:\\Python27']<br />

>>> glob.glob ('C:\\Python27\\*')<br />

['C:\\Python27\\DLLs', 'C:\\Python27\\Doc',<br />

'C:\\Python27\\include', 'C:\\Python27\\Lib',<br />

'C:\\Python27\\libs', 'C:\\Python27\\LICENSE.txt',<br />

'C:\\Python27\\NEWS.txt',<br />

'C:\\Python27\\python.exe',<br />

'C:\\Python27\\pythonw.exe',<br />

'C:\\Python27\\README.txt',<br />

'C:\\Python27\\Scripts', 'C:\\Python27\\share',<br />

'C:\\Python27\\tcl', 'C:\\Python27\\Tools']<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

53


glob.glob ('C:\\Python27\\[ps]*')<br />

['C:\\Python27\\python.exe',<br />

'C:\\Python27\\pythonw.exe',<br />

'C:\\Python27\\Scripts', 'C:\\Python27\\share']<br />

>>> glob.glob ('C:\\Python27\\[!ps]*')<br />

['C:\\Python27\\DLLs', 'C:\\Python27\\Doc',<br />

'C:\\Python27\\include', 'C:\\Python27\\Lib',<br />

'C:\\Python27\\libs', 'C:\\Python27\\LICENSE.txt',<br />

'C:\\Python27\\NEWS.txt',<br />

'C:\\Python27\\README.txt', 'C:\\Python27\\tcl',<br />

'C:\\Python27\\Tools']<br />

>>> glob.glob ('C:\\Python27\\?EADME.txt')<br />

['C:\\Python27\\README.txt']<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 54


EJERCICIOS: 6, 7, 8, 9, 10, 11, 12, 13<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 55


Módulo math<br />

MATEMÁTICAS<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 56


Matemáticas<br />

Todo lo que necesitamos lo encontraremos en el<br />

módulo<br />

math<br />

Contiene definiciones de constantes y funciones<br />

matemáticas básicas.<br />

pi<br />

e<br />

degrees (x)<br />

radians (x)<br />

Constantes<br />

Número pi<br />

Número e (base del logaritmo neperiano)<br />

Conversión angular<br />

Transforma radianes a grados<br />

Transforma grados a radianes<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

57


Matemáticas (II)<br />

Funciones trigonométricas<br />

math.acos(x)<br />

math.asin(x)<br />

math.atan(x)<br />

math.sin(x)<br />

devuelve el coseno del arco 'x' (en radianes)<br />

Seno del arco ‘x’<br />

arcotangente<br />

devuelve en seno de 'x'. ('x' en radianes)<br />

Funciones hiperbólicas<br />

math.tan(x)<br />

math.acosh(x)<br />

math.asinh(x)<br />

math.atanh(x)<br />

Tangente<br />

Devuelve el coseno hiperbólico del arco ‘x’ (en rad)<br />

Seno del arco hiperbólico ‘x’<br />

Arcotangente hiperbólica<br />

math.cosh(x) Devuelve el coseno hiperbólico de x.<br />

math.sinh(x)<br />

10/04/2013<br />

Seno hiperbólico<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

58


Matematicas (III)<br />

Exponenciales y logarítmicas<br />

math.exp(x)<br />

math.log(x[, base])<br />

exponencial en base e<br />

si no le damos una base, toma e (neperiano)<br />

math.log1p(x) devuelve el logaritmo de 1+x (base e)<br />

math.log10(x)<br />

math.pow(x, y)<br />

math.sqrt(x)<br />

logaritmo decimal<br />

eleva la base 'x' al exponente 'y'<br />

raíz cuadrada de 'x'<br />

math.hypot(x, y) devuelve la norma euclídea (sqrt(x ** 2 + y ** 2))<br />

Funciones de redondeo y caracterización<br />

math.fabs(x)<br />

valor absoluto de x<br />

math.factorial(x) factorial. Lanza ValueError si x no es entero o < 0<br />

math.floor()<br />

math.ceil(x)<br />

devuelve el mayor entero = x<br />

math.fmod(x) resto de la división entera (de acuerdo a C)<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

59


Matemáticas. Ejemplo<br />

>>> import math<br />

>>> math.pi<br />

3.1415926535897931<br />

>>> math.e<br />

2.7182818284590451<br />

>>> math.degrees(math.pi)<br />

180.0<br />

>>> math.radians(360)<br />

6.2831853071795862<br />

>>> math.exp(1)<br />

2.7182818284590451<br />

>>> math.log(4,2)<br />

2.0<br />

>>> math.log10(1000)<br />

3.0<br />

>>> math.pow(3,2.5)<br />

15.588457268119896<br />

>>> math.hypot(1,1)<br />

1.4142135623730951<br />

10/04/2013<br />

>>> math.fabs(3.5)<br />

3.5<br />

>>> math.ceil(3.5)<br />

4.0<br />

>>> math.ceil(3.4)<br />

4.0<br />

>>> math.fmod(5,2)<br />

1.0<br />

>>> math.fmod(5.4,2)<br />

1.4000000000000004<br />

>>> math.ceil(3.5)<br />

4.0<br />

>>> math.ceil(3.4)<br />

4.0<br />

>>> math.fmod(5,2)<br />

1.0<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

>>> math.fmod(5.4,2)<br />

1.4000000000000004<br />

60


EJERCICIOS: 14 Y 15<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 61


Módulo Pickle<br />

PERSISTENCIA DE OBJETOS<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 62


Persistencia de Objetos: Serialización<br />

• Consiste en el almacenado rápido en fichero de cualquier objeto python<br />

para su posterior carga y uso.<br />

– Por ejemplo, un diccionario con valores o rangos de parámetros válidos para la<br />

ejecución de un script, un conjunto de templates estelares o extragalácticos, …<br />

• El módulo Pickle codifica y decodifica objetos de cualquier tamaño, por<br />

muy complicada que sea su estructura interna. Podemos usarlo como<br />

superclase de la que heredar.<br />

• cPickle es otra de las posibilidades. Está implementado en C y se estima<br />

en unas 1000 veces más veloz que Pickle. El problema es que no es<br />

heredable.<br />

• Ambos módulos implementan funciones similares.<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

63


Persistencia de objetos (II)<br />

Sólo necesitamos dos funciones de este módulo:<br />

• pickle.dump(objeto, objeto_fichero_permiso_<br />

escritura)<br />

Con dump, guardamos el ‘objeto’ en un ‘objeto_fichero’<br />

con permisos de escritura. Tendremos que crearlo de esta<br />

forma:<br />

objeto_fichero = open (‘ruta_fichero’, ‘w’)<br />

• pickle.load(objeto_fichero_permiso_lectura)<br />

Abrimos un fichero en modo lectura y se lo pasamos a<br />

‘load’. Retorna el objeto tal y como se guardó con<br />

‘dump’.<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

64


Persistencia de objetos. Ejemplo.<br />

>>> import pickle<br />

>>> data = {'entero': 3, 'float': 2.33, 'complejo': 1+3j, 'lista': range(100), 'tupla':<br />

(1,2,3), 'diccionario': {'nombre': 'Sara', 'edad': 20}}<br />

>>> fout = open('fichero.pick', 'w')<br />

>>> pickle.dump(data, fout)<br />

>>> data = {}<br />

>>> fout.close()<br />

>>> fin = open('fichero.pick', 'r')<br />

>>> new_data = pickle.load(fin)<br />

>>> new_data['entero']<br />

3<br />

>>> new_data<br />

{'tupla': (1, 2, 3), 'float': 2.3300000000000001, 'complejo': (1+3j), 'entero': 3,<br />

'lista': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,<br />

28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,44, 45, 46, 47, 48, 49, 50, 51, 52, 53,<br />

54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,<br />

80, 81, 82, 83, 84, 85, 86, 87,88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], 'diccionario': {'edad': 20, 'n<br />

ombre': 'Sara'}}<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

65


EJERCICIOS: 16 Y 17<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 66


Módulo random<br />

NÚMEROS ALEATORIOS<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 67


Números Aleatorios<br />

El módulo<br />

random<br />

implementa la generación de números pseudo-aleatorios para<br />

varias distribuciones (uniforme, normal, lognormal, …)<br />

La primera función que debe llamarse es la de la generación<br />

de la semilla de números aleatorios<br />

random.seed ([x])<br />

donde x es la semilla. Si no se especifica una, se utiliza el valor<br />

del tiempo actual del sistema.<br />

Semillas distintas, dan distintas secuencias de números<br />

aleatorios.<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

68


Números aleatorios. Funciones<br />

Funciones para enteros<br />

random.randrange([start], stop[, ste<br />

p])<br />

random.randint(a, b)<br />

Devuelve un número aleatorio entre start y stop, con intervalo entre valores<br />

step.<br />

Devuelve un número entero entre a y b (ambos inclusive)<br />

Funciones para secuencias<br />

random.choice(seq)<br />

random.shuffle(x)<br />

random.sample(population, k)<br />

Devuelve un elemento seleccionado al azar de la lista seq<br />

Baraja la lista x<br />

Devuelve una muestra de k elementos seleccionados al azar y sin repetición de<br />

la lista population<br />

Funciones para distribuciones matemáticas<br />

random.random() Devuelve un número float aleatorio en [0, 1)<br />

random.uniform(a, b)<br />

Devuelve un número aleatorio en [a, b] (distribución uniforme)<br />

random.gauss(mu, sigma)<br />

10/04/2013<br />

Devuelve un número aleatorio según una distribución gausiana de media mu y<br />

desviación estándar sigma<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

69


Números aleatorios. Ejemplo.<br />

>>> random.random() # float aleatorio x, 0.0 >> random.uniform(1, 10) # float aleatorio x, 1.0 >> random.randint(1, 10) # Entero desde 1 a 10, extremos incluidos<br />

7<br />

>>> random.randrange(0, 101, 2) # Entero par desde 0 hasta 100<br />

26<br />

>>> random.choice('abcdefghij') # Elige aleatoriamente un elemento<br />

'c'<br />

>>> items = [1, 2, 3, 4, 5, 6, 7]<br />

>>> random.shuffle(items)<br />

>>> items<br />

[7, 3, 2, 5, 6, 4, 1]<br />

>>> random.sample([1, 2, 3, 4, 5], 3) # Elige 3 elementos<br />

[4, 1, 5]<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

70


EJERCICIOS: 18, 19, 20 Y 21<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 71


Módulo zipfile<br />

FICHEROS EN FORMATO<br />

COMPRIMIDO<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 72


Ficheros Comprimidos<br />

Existen módulos para el trabajo con los formatos<br />

comunes de archivado y compresión, incluyendo:<br />

• zlib<br />

• gzip<br />

• bz2<br />

• zipfile<br />

• tarfile<br />

Nos centraremos en el módulo ‘zipfile’.<br />

Para satisfacer la curiosidad de alumnos inquietos, se recomienda la web<br />

http://docs.python.org/py-modindex.html<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

73


Ficheros comprimidos: Módulo zipfile<br />

zipfile.ZipFile (file[, mode])<br />

Permite la lectura y escritura, agregar nuevos datos y listar el<br />

contenido de un fichero en formato estándar ZIP.<br />

zipfile.is_zipfile(filename)<br />

Atributos<br />

Devuelve la lista de nombres de elementos dentro del paquete ZIP.<br />

Métodos<br />

zipfile.ZipFile (file[, mode])<br />

defecto y siempre sólo lectura). pwd la contraseña para ficheros encriptados.<br />

donde mode será ‘r’ (lectura) , ‘w’ (escritura), ‘a’ (añadir o crear, si no<br />

existe).<br />

Cierra el fichero ZIP<br />

Tiene más parámetros opcionales, pero no serán tratados en este<br />

extracción<br />

curso.<br />

zipfile.is_zipfile(filename) (os.getcwd ())<br />

Devuelve True si filename<br />

Muestra<br />

es un<br />

el contenido<br />

fichero<br />

del fichero<br />

ZIP<br />

por<br />

válido.<br />

pantalla (stdout)<br />

False en caso<br />

contrario.<br />

ZipFile.namelist()<br />

ZipFile.getinfo(name)<br />

ZipFile.open(name[, mode[, pwd]])<br />

ZipFile.close()<br />

ZipFile.extract(member, [path[, pwd]])<br />

ZipFile.extractall([path[, members[, pwd]]])<br />

ZipFile.printdir()<br />

ZipFile.testzip()<br />

ZipFile.write(filename[, arcname[, compress<br />

_type]])<br />

10/04/2013<br />

Métodos básicos del módulo zipfile<br />

Clase de ficheros ZIP. mode será ‘r’ (lectura) , ‘w’ (escritura), ‘a’ (añadir o crear, si no existe).<br />

Devuelve True si filename es un fichero ZIP válido. False en caso contrario.<br />

Métodos de la clase ZipFile<br />

Devuelve un objeto ZipInfo con información del archivo miembro del paquete ZIP llamado<br />

name.<br />

Extrae el miembro llamado name del paquete ZIP. mode es el modo de extracción (‘r’ por<br />

Extrae el miembro member al directorio actual. path especifica un directorio alternativo de<br />

Extrae todo el contenido del ZIP al directorio path. Por defecto path es el directorio actual<br />

Comprueba el fichero ZIP. Devuelve el nombre del primer fichero corrupto del paquete. None<br />

si todo está bien.<br />

Escribe el fichero filename en arcname. Si este último no se da, sobreescribe el primero. El<br />

paquete ZIP debió abrirse en formato ‘w’ o ‘a’. De no ser así se lanzará la exceptión del tipo<br />

RuntimeError.<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

74


Ficheros comprimidos. Ejemplo.<br />

>>> fzip = zipfile.ZipFile ('cosa.zip','a')<br />

>>> os.listdir (os.getcwd ())<br />

['cosa.zip', 'ejercicio1.py', 'ejercicio2.py', 'ejercicio3.py', 'ejercicio4.py']<br />

>>> fzip.write('ejercicio1.py')<br />

>>> fzip.write ('ejercicio2.py')<br />

>>> fzip.printdir ()<br />

File Name Modified Size<br />

ejercicio1.py 2012-03-07 20:59:22 681<br />

ejercicio2.py 2012-03-08 00:02:45 207<br />

>>> f = fzip.extract ('ejercicio1.py')'<br />

>>> fzip.close ()<br />

10/04/2013<br />

César Husillos Rodríguez<br />

Víctor Terrón Salas<br />

75


EJERCICIOS: 22<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 76


Curiosidades …<br />

PARA TERMINAR …<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 77


Curiosidad<br />

Recomiendo visitar esta dirección web.<br />

https://pypi.python.org/pypi<br />

• Encontrará 29841 paquetes a fecha del<br />

10/04/2013 desarrollados por la comunidad<br />

Python.<br />

– 19475 en febrero de 2012<br />

• Es un aliciente para seguir trabajando en Python.<br />

– SEGURO que existe algún paquete que es de tu<br />

interés.<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 78


FIN<br />

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 79

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!