programacion en python parte 2

44
Programación en Python Parte 2 Mariano Reingart [email protected]

Upload: adrian-jesus

Post on 07-Mar-2016

252 views

Category:

Documents


9 download

DESCRIPTION

como programar en python.

TRANSCRIPT

Page 1: programacion en python parte 2

Programación en Python

Parte 2Mariano Reingart

[email protected]

Page 2: programacion en python parte 2

Introducción a la Librería Estándar

Biblioteca de módulos estándar; Pilas Incluídas!Modulos: Archivos .py (fuentes) y .c (compilados)Incluida con el interprete por defectoAlgunos modulos depende de la plataforma (ej. winreg)Documentada en la Referencia Standard LibraryMás de 300 módulos!

Page 3: programacion en python parte 2

Introducción a la Librería Estándar

Cadenas: string, re, StringIO, codecsTipos de datos: datetime, array, queue, copy, ...Números y Matemática: decimal, math, randomArchivos: os.path, glob, stat, tempfilePersistencia: pickle, shelve, dbm, sqlite3Compresión: zlib, bz2, zipfile, tarfileFormatos: csv, ConfigParserCriptografía: haslib, md5, shaSistema operativo: os, time, loggingComunicación: subprocess, socket, signal, popen2

Page 4: programacion en python parte 2

Introducción a la Librería Estándar

Internet: email, json, rfc822, base64, uuInternet: cgi, urllib, httplib, ftplib, poplib, smtplibLenguajes de Marcas:sgmlib, htmllib, xml.*Internacionalización: locale, gettextInterface gráfica de usuario: Tkinker, turtle, idleDesarroyo: pydoc, doctest, unittest, testDepuración: pdb, profile, timeit, tracePython: sys, traceback, inspect, site, imputil, tokenize, compileall, cmd, shlexPlataformas: Win32, Unix, MacOS, SGI, SunOS

Page 5: programacion en python parte 2

Sistema (python): sys

�Funciones y atributos ppales:�exit(estado): sale del interprete (devuelve estado)path: lista de rutas para ubicar módulos de pythonargv: lista de argumentos de la linea de comandostdin, stdout, stderr: entrada, salida y error estandar (simil archivos)

>>> import sys>>> sys.stdout = open("salida.txt","w")>>> print "hola mundo" # graba en salida.txt

Page 6: programacion en python parte 2

Tiempo: time

�Funciones y atributos ppales:�time(): tiempo (en segundos) desde la epoca unixgmtime(): tiempo en UTC (GMT)localtime(): fecha y hora local (como tupla)sleep(segundos): duerme por x segundosclock(): reloj de la CPUmktime: convierte una tupla en tiempo time()strftime(formato, tiempo): convierte a string

>>> from time import gmtime, strftime>>> strftime("%a, %d %b %Y %H:%M:%S +0000")'Thu, 13 Aug 2009 02:24:32 +0000'

Page 7: programacion en python parte 2

Expesiones Regulares: re�Funciones:

�compile(patrón): compila una regex�match(patrón, cadena): comprueba coincidenciasearch(patrón, cadena): busca coincidenciasplit(patrón, cadena): divide según coincidenciasfindall(patrón, cadena): devuelve una lista de todas coincidencias que no se superponensub(patrón, reemplazo, cadena): busca todas coincidencias y realiza los reemplazos

>>> import re>>> re.match("c", "abcdef") # no hay coincidencia>>> re.search("c", "abcdef") # coincidencia!<_sre.SRE_Match object at ...>

Page 8: programacion en python parte 2

Expesiones Regulares: re�Caracteres especiales:

�.: todos los caracteres menos \n�^: comienzo de linea/cadena$: fin de linea/cadena*: cero o más repeticiones+: una o más repeticiones?: cero o una repetición{m,n}: m a n repeticiones[]: conjunto de caracteres|: separa expresiones regulares (una o la otra)

>>> re.match(".*c.*", "abcdef") # coincidencia!

Page 9: programacion en python parte 2

Expesiones Regulares: re�Grupos:

�(...): si coincide, almacena comienzo y final grupo�(?P<name>...): idem pero grupo con nombre(?P=name): coincide con el grupo con nombre

>>> regex = re.compile(r"(?P<apellido>\w+), (?P<nombre>\w+)")>>> match = re.match(regex,"Reingart, Mariano")>>> print match.group("nombre")>>> print match.group("apellido")MarianoReingart

Page 10: programacion en python parte 2

Entrada/Salida en memoria: StringIOimport StringIO

# creo un archivo (buffer en memoria)output = StringIO.StringIO()output.write('Primera linea.\n')print >>output, 'Segunda linea.'

# obtengo el contenido del archivo en memoriaprint output.getvalue()

# cierro el archivo y descarto el bufferoutput.close()

Page 11: programacion en python parte 2

Fechas y horas: datetime

>>> import datetime>>> hoy = datetime.date.today()>>> print hoy2009-02-26>>> ahora = datetime.datetime.now()>>> print ahora2009-02-26 14:15:16.025000>>> hoy + datetime.timedelta(days=4)datetime.date(2009, 3, 2)>>> cumple = datetime.date(2009, 07, 23)>>> cumple - hoydatetime.timedelta(147)>>> cumple.strftime("%d de %B de %Y")'23 de Julio de 2009'

Page 12: programacion en python parte 2

Numeros de "punto fijo": decimal

>>> f = 1.1 # float o (punto flotante binario)>>> f1.1000000000000001>>> f * 22.2000000000000002>>> import decimal>>> d = decimal.Decimal("1.1")>>> d * 2Decimal("2.2")>>> decimal.getcontext().prec = 6 # ajusto la precisión>>> decimal.Decimal(1) / decimal.Decimal(7)Decimal("0.142857")

Page 13: programacion en python parte 2

Números aleatorios: random

>>> import random>>> random.choice(['manzana', 'pera', 'banana'])'manzana'>>> random.sample(xrange(100), 10) # elección sin reemplazo[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]>>> random.random() # un float al azar0.17970987693706186>>> random.randrange(6) # un entero al azar tomado de range(6)4

Page 14: programacion en python parte 2

Matemática: math

>>> import math>>> math.cos(math.pi / 4.0)0.70710678118654757>>> math.log(1024, 2)10.0

Funciones:Exponenciales y Logarítmicas: exp, log, powTrigonométricas: cos, sin, tan, acos, asin, atanÁngulos: degree, radiansHiperbólicas: cosh, sinh, tanh... Constantes: pi y e

Page 15: programacion en python parte 2

Archivos y directorios: osFunciones de os:

listdir(ruta): devuelve la lista de entradas (dir)remove(ruta): elimina un archivorename(ruta): cambia el nombre de un archivochdir(ruta): cambia a un directorio de trabajogetcwd(): devuelve el directorio actualmkdir(ruta): crea un directoriormdir(ruta): borra un directoriomkdirs(ruta): crea una jerarquia de directoriosremovedirs(ruta): elimina recursivamenterenames(ruta): renombra recursivamente

Page 16: programacion en python parte 2

Archivos y directorios: osFunciones de os.path:

basename(ruta): nombre base (archivo)dirname(ruta): extrae ruta (directorio)abspath(ruta): ruta absolutaisfile(ruta), isdir(ruta): verifica el tipoexists(ruta): verifica si existe la rutasplitext(ruta): divide una ruta en (nombre, ext)walk(path, visit, arg): recorre recursivamente los directorios, llamando a visit(arg, dirname, names)

Page 17: programacion en python parte 2

Archivos y directorios: os>>> import os>>> os.listdir("c:/")['Archivos de programa', 'AUTOEXEC.BAT' …]>>> os.path.isdir("C:/AUTOEXEC.BAT")False>>> os.mkdir("C:/prueba")>>> os.path.join("C:\\prueba","mi-archivo.txt")'C:\\prueba\\mi-archivo.txt'>>> os.path.exists('C:\\prueba\\mi-archivo.txt')False>>> os.path.splitext('mi-archivo.txt')('mi-archivo', '.txt')>>> os.path.dirname('C:\\prueba\\mi-archivo.txt')'C:\\prueba'>>> os.path.basename('C:\\prueba\\mi-archivo.txt')'mi-archivo.txt'

Page 18: programacion en python parte 2

Procesos: osFunciones de os:

execv(ruta, args): ejecuta un nuevo programasystem(comando): ejecuta un comando del s.o.fork(): inica un proceso hijokill(pid, señal): envía una señal a un procesowaitpid(pid, options): espera un proceso

>>> import os>>> os.execv("C:\\PROGRAMA.EXE", ["A","B","C"])>>> os.system("notepad.exe")>>> pid = os.spawnv(os.P_NOWAIT,"notepad.exe",[])>>> os.kill(pid, 9) # enviar señal, solo unix>>> os.waitpid(pid, 0) # esperar al proceso(304, 0)

Page 19: programacion en python parte 2

Procesos: subprocessEngendrar nuevos procesosConectart a las pipas de entrada/salida/errorObtener el valor de retorno(os.system, os.spawn*, os.popen*, popen2.*)

>>> from subprocess import Popen, PIPE>>> p1 = Popen(["ipconfig"], stdout=PIPE) # crear una “pipa”>>> output = p1.communicate(input=None)>>> output('Configuración IP … Adaptador Ethernet coLinux: … Dirección IP:192.168.0.2 ...', None)

Page 20: programacion en python parte 2

Hilos: threadingimport threading, time

class MiHilo(threading.Thread): def __init__(self, parametros): threading.Thread.__init__(self) self.params = parametros def run(self): print "ejecutando thread con ", params time.sleep(5) # duerme 5 seg (ver GIL**) print "terminando thread"

seg_plano = MiHilo('parametros')seg_plano.start() # inicio la tareaprint 'continúa la ejecución en primer plano.'seg_plano.join() # esperar que termine la tareaprint 'el segundo plano listo.'

Page 21: programacion en python parte 2

Procesos múltiples: (multi)processingfrom processing import Processimport time

def f(name): print 'hola', name time.sleep(10) print 'chau', name

if __name__ == '__main__': # creo el proceso p = Process(target=f, args=('bob',)) p.start() # lo inicio p.join() # espero que termine

Page 22: programacion en python parte 2

Conexiones: sockets (servidor)# Servidor de Ecos

import socket

HOST = '' # todas las interfasesPORT = 50007 # puerto no privilegiado (>1024)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind((HOST, PORT)) # me vinculo al host/puertos.listen(1) # escucho por conexionesconn, addr = s.accept() # acepto la conexiónprint 'Connectado de', addrwhile 1: data = conn.recv(1024) # recibo datos if not data: break conn.send(data) # envio datosconn.close() # cierro el socket

Page 23: programacion en python parte 2

Conexiones: sockets (cliente)# Cliente de Eco

import socket

HOST = 'localhost' # equipo remotoPORT = 50007 # puerto del servidor

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((HOST, PORT)) # me conectos.send('Hola mundo') # envío datosdata = s.recv(1024) # recibo datoss.close() # cierro el socketprint 'Recibido:', repr(data)

Page 24: programacion en python parte 2

Conexiones asincrónicas: asyncoreimport asyncore, time; from socket import *

class TimeChannel(asyncore.dispatcher): def handle_write(self): self.send(time.strftime("%x %X")) self.close()class TimeServer(asyncore.dispatcher): def __init__(self, port=37): asyncore.dispatcher.__init__(self) self.create_socket(AF_INET, SOCK_STREAM) self.bind(("", port)) self.listen(5) def handle_accept(self): channel, addr = self.accept() TimeChannel(channel)server = TimeServer(8037)asyncore.loop()

Page 25: programacion en python parte 2

Internet: cliente web (http)urllib2: cliente http de alto nivel httplib: cliente http de bajo nivel

>>> import urllib2>>> URL='http://tycho.usno.navy.mil/cgi-bin/timer.pl'>>> for line in urllib2.urlopen(URL):... if 'EST' in line or 'EDT' in line: ... print line

>>> import httplib>>> conn = httplib.HTTPConnection("www.python.org")>>> conn.request("GET", "/index.html")>>> r1 = conn.getresponse()>>> print r1.status, r1.reason200 OK>>> data1 = r1.read()

Page 26: programacion en python parte 2

Internet: servidor web (http)from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class Handler(BaseHTTPRequestHandler): def do_GET(self): if self.path != "/": self.send_error(404, "File not found") else: self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write("<html><body><p>Hola Mundo!</p></body></html>\n")

httpd = HTTPServer(("", 8000), Handler)httpd.serve_forever()

Page 27: programacion en python parte 2

Internet: analizador de páginas html / xhtmlfrom HTMLParser import HTMLParserfrom urllib2 import urlopen

class Spider(HTMLParser): "Buscar links (<A>) de una página web" def __init__(self, url): HTMLParser.__init__(self) req = urlopen(url) self.feed(req.read())

def handle_starttag(self, tag, attrs): if tag == 'a' and attrs: print "Link encontrado => %s" % attrs[0][1]

Spider('http://www.python.org')

Page 28: programacion en python parte 2

Internet: codificaciones (base64, json)>>> import base64>>> encoded = base64.b64encode('data to be encoded')>>> encoded'ZGF0YSB0byBiZSBlbmNvZGVk'>>> data = base64.b64decode(encoded)>>> data'data to be encoded'

# javascript object notation (py2.6)>>> import json >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])'["foo", {"bar": ["baz", null, 1.0, 2]}]'

Page 29: programacion en python parte 2

Internet: correo electrónico (smtp)email: objetos para construir correos electrónicos smtplib: cliente smtp para transferir mails

import smtplibfrom email.mime.text import MIMEText

# creo el mailmsg = MIMEText("Mensaje de texto")msg['Subject'] = 'Motivo del mail'msg['From'] = "[email protected]"msg['To'] = "[email protected]"

# envio el mailsmtp = smtplib.SMTP("smtp.prueba.com.ar")smtp.sendmail(msg['From'], msg['To'], msg.as_string())

Page 30: programacion en python parte 2

Internet: correo electrónico (pop3 e imap)import poplib, imaplib, getpass

m = poplib.POP3('localhost') # conexiónm.user(getpass.getuser()) # inicio sesiónm.pass_(getpass.getpass())numMessages = len(m.list()[1]) # cantidad de mailsprint m.retr(1)[1] # imprimo el 1ro

m = imaplib.IMAP4()m.login(getpass.getuser(), getpass.getpass())m.select()typ, data = m.search(None, 'ALL') # busco los msgfor num in data[0].split(): typ, data = m.fetch(num, '(RFC822)') # obtengo msg print 'Mensaje %s\n%s\n' % (num, data[0][1])m.close()m.logout()

Page 31: programacion en python parte 2

Internet: servidor correo electrónico (smtp)import smtpdimport asyncore

class CustomSMTPServer(smtpd.SMTPServer): def process_message(self, peer, mailfrom, rcpttos, data): print 'Equipo:', peer print 'Remitente:', mailfrom print 'Destinatario:', rcpttos print 'Longitud:', len(data) return

server = CustomSMTPServer(('127.0.0.1', 1025), None)asyncore.loop()

Page 32: programacion en python parte 2

Internet: mails multiparte (ej. imagenes)import email.mime

msg = email.mime.Multipart.MIMEMultipart()msg['Subject'] = 'Esto es una prueba'msg['From'] = '[email protected]'msg['Reply-to'] = '[email protected]'msg['To'] = '[email protected]'msg.preamble = 'Mensaje de multiples partes.\n'

part = email.mime.Text.MIMEText("Texto")msg.attach(part)imagen = open("serpiente.png","rb").read()email.mime.Image.MIMEImage(imagen)part.add_header('Content-Disposition', 'attachment', filename="imagen.jpg")msg.attach(part) # Se pueden seguir agregando partes msg.as_string()

Page 33: programacion en python parte 2

Internet: transferencias de archivos (ftp)

>>> from ftplib import FTP>>> ftp = FTP('ftp.prueba.com') # conectar>>> ftp.login() # usuario anónimo>>> ftp.retrlines('LIST') # listar directorio total 24418drwxrwsr-x 5 ftp-usr pdmaint 1536 Mar 20 09:48 README>>> ftp.retrbinary('RETR README', open('README', 'wb').write)'226 Transfer complete.'>>> ftp.quit()

Page 34: programacion en python parte 2

Planillas delimitadas por coma: csv

import csv# abrir el archivo y procesar el archivo csv

csv_reader = csv.reader(open("archivo.csv"))

# recorrer las filas de la planillafor fila in csv_reader:

# leer las columnas y asignarlas a las variables celda1, celda2, celda3 ... = fila

# muestro las celdas print celda1, celda2

Page 35: programacion en python parte 2

Manejo simple de XML: xml.dom.minidom>>> from xml.dom.minidom import parse, parseString

>>> dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')>>> dom3<xml.dom.minidom.Document instance at 0x01F508A0>>>> dom3.childNodes[<DOM Element: myxml at 0x1f545a8>]>>> node = dom3.childNodes[0]>>> node.toxml()u'<myxml>Some data<empty/> some more data</myxml>'>>> node.tagNameu'myxml'>>> node.childNodes[0].nodeValueu'Some data'

Page 36: programacion en python parte 2

Archivos estrucutrados binarios: structimport structdatos = open('miarchivo.zip', 'rb').read()inicio = 0for i in range(3): # mostrar los 3 encabezados inicio += 14 campos = struct.unpack('<IIIHH', datos[inicio:inicio+16]) crc32, tam_comp, tam_descomp, tam_nomarch, tam_extra = fields inicio += 16 nomarch = datos[inicio:inicio+tam_nomarch] inicio += tam_nomarch extra = datos[inicio:inicio+tam_extra] print nomarch, hex(crc32), tam_comp, tam_descomp inicio += tam_extra + tam_comp # saltear

Page 37: programacion en python parte 2

Compresión con zlib>>> import zlib>>> s = 'witch which has which witches wrist watch'>>> len(s)41>>> t = zlib.compress(s)>>> len(t)37>>> zlib.decompress(t)'witch which has which witches wrist watch'>>> zlib.crc32(s)226805979

Page 38: programacion en python parte 2

Compresión con zip: zipfileimport zipfile

file = zipfile.ZipFile("ejemplo.zip", "r")

# listar nombres de archivosfor name in file.namelist(): print name,

# listar información de archivos zipeadosfor info in file.infolist(): print info.filename, info.date_time, info.file_size

# leo los archivos comprimidosfor name in file.namelist(): data = file.read(name) print name, len(data), repr(data[:10])

Page 39: programacion en python parte 2

Registro: logging

import logginglogging.debug('Información de depuración')logging.info('Mensaje informativo')logging.warning('Atención: archivo de configuración %s no se encuentra','server.conf')logging.error('Ocurrió un error')logging.critical('Error crítico -- cerrando')

Page 40: programacion en python parte 2

Depuración: pdbFunciones de pdb:

set_trace(): comienza depuraciónpm(): comienza modo post-mortemrun(orden): ejecuta orden en depuración

import pdbfor i in xrange(1000): if i==500: pdb.set_trace()

> debug.py(3)<module>()-> for i in xrange(1000):(Pdb) p i500(Pdb) c

Page 41: programacion en python parte 2

Depuración: pdbComandos principales de pdb:

p: imprime contenido de expresións: ejecuta entrando a las funcionesn: ejecuta hasta la próxima lineac: continua con la ejecución normalr: ejecuta hasta finalizar la funciónw: muestra la traza actuall: lista el código fuenteb: inserta una interrupción para el archivo y lineaj: salta a una linea predeterminadaq: termina el programa

Page 42: programacion en python parte 2

Prueba por documentación: doctest

def promedio(valores): """Calcula la media aritmética de una lista >>> print promedio([20, 30, 70]) 40.0 """ return sum(valores, 0.0) / len(valores)

import doctest# valida automáticamente las pruebas integradasdoctest.testmod()

Page 43: programacion en python parte 2

Prueba de unidades: unittest def promedio(valores): return sum(valores, 0.0) / len(valores)

import unittestclass TestFuncionesEstadisticas(unittest.TestCase): def test_promedio(self): self.assertEqual(promedio([20, 30, 70]), 40.0) self.assertEqual(round(promedio([1, 5, 7]), 1), 4.3) self.assertRaises(ZeroDivisionError, promedio, []) self.assertRaises(TypeError, promedio, 20, 30, 70)

# ejecuta todas las pruebasunittest.main()

Page 44: programacion en python parte 2

Documentación y Ayuda

Documentación Oficial: http://docs.python.org/Libro Python para todosPython Argentina: Aprendiendo Python