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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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!