Cuarto dÃa (PDF, 900 KB)
Cuarto dÃa (PDF, 900 KB)
Cuarto dÃa (PDF, 900 KB)
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