Page 1

Programaci贸n en Python Parte 2 Mariano Reingart reingart@gmail.com


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 defecto Algunos modulos depende de la plataforma (ej. winreg) Documentada en la Referencia Standard Library Más de 300 módulos!


Introducción a la Librería Estándar Cadenas: string, re, StringIO, codecs Tipos de datos: datetime, array, queue, copy, ... Números y Matemática: decimal, math, random Archivos: os.path, glob, stat, tempfile Persistencia: pickle, shelve, dbm, sqlite3 Compresión: zlib, bz2, zipfile, tarfile Formatos: csv, ConfigParser Criptografía: haslib, md5, sha Sistema operativo: os, time, logging Comunicación: subprocess, socket, signal, popen2


Introducción a la Librería Estándar Internet: email, json, rfc822, base64, uu Internet: cgi, urllib, httplib, ftplib, poplib, smtplib Lenguajes de Marcas:sgmlib, htmllib, xml.* Internacionalización: locale, gettext Interface gráfica de usuario: Tkinker, turtle, idle Desarroyo: pydoc, doctest, unittest, test Depuración: pdb, profile, timeit, trace Python: sys, traceback, inspect, site, imputil, tokenize, compileall, cmd, shlex Plataformas: Win32, Unix, MacOS, SGI, SunOS


Sistema (python): sys Funciones y atributos ppales: exit(estado): sale del interprete (devuelve estado) path: lista de rutas para ubicar m贸dulos de python argv: lista de argumentos de la linea de comando stdin, stdout, stderr: entrada, salida y error estandar (simil archivos) >>> import sys >>> sys.stdout = open("salida.txt","w") >>> print "hola mundo" # graba en salida.txt


Tiempo: time Funciones y atributos ppales: time(): tiempo (en segundos) desde la epoca unix gmtime(): tiempo en UTC (GMT) localtime(): fecha y hora local (como tupla) sleep(segundos): duerme por x segundos clock(): reloj de la CPU mktime: 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'


Expesiones Regulares: re Funciones: compile(patrón): compila una regex match(patrón, cadena): comprueba coincidencia search(patrón, cadena): busca coincidencia split(patrón, cadena): divide según coincidencias findall(patrón, cadena): devuelve una lista de todas coincidencias que no se superponen sub(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 ...>


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!


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") Mariano Reingart


Entrada/Salida en memoria: StringIO import 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 memoria print output.getvalue() # cierro el archivo y descarto el buffer output.close()


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


Numeros de "punto fijo": decimal >>> f = 1.1 # float o (punto flotante binario) >>> f 1.1000000000000001 >>> f * 2 2.2000000000000002 >>> import decimal >>> d = decimal.Decimal("1.1") >>> d * 2 Decimal("2.2") >>> decimal.getcontext().prec = 6 # ajusto la precisi贸n >>> decimal.Decimal(1) / decimal.Decimal(7) Decimal("0.142857")


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 azar 0.17970987693706186 >>> random.randrange(6) # un entero al azar tomado de range(6) 4


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, pow Trigonométricas: cos, sin, tan, acos, asin, atan Ángulos: degree, radians Hiperbólicas: cosh, sinh, tanh... Constantes: pi y e


Archivos y directorios: os Funciones de os: listdir(ruta): devuelve la lista de entradas (dir) remove(ruta): elimina un archivo rename(ruta): cambia el nombre de un archivo chdir(ruta): cambia a un directorio de trabajo getcwd(): devuelve el directorio actual mkdir(ruta): crea un directorio rmdir(ruta): borra un directorio mkdirs(ruta): crea una jerarquia de directorios removedirs(ruta): elimina recursivamente renames(ruta): renombra recursivamente


Archivos y directorios: os Funciones de os.path: basename(ruta): nombre base (archivo) dirname(ruta): extrae ruta (directorio) abspath(ruta): ruta absoluta isfile(ruta), isdir(ruta): verifica el tipo exists(ruta): verifica si existe la ruta splitext(ruta): divide una ruta en (nombre, ext) walk(path, visit, arg): recorre recursivamente los directorios, llamando a visit(arg, dirname, names)


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'


Procesos: os Funciones de os: execv(ruta, args): ejecuta un nuevo programa system(comando): ejecuta un comando del s.o. fork(): inica un proceso hijo kill(pid, se単al): env鱈a una se単al a un proceso waitpid(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)


Procesos: subprocess Engendrar nuevos procesos Conectart a las pipas de entrada/salida/error Obtener 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)


Hilos: threading import 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 tarea print 'contin煤a la ejecuci贸n en primer plano.' seg_plano.join() # esperar que termine la tarea print 'el segundo plano listo.'


Procesos mĂşltiples: (multi)processing from processing import Process import 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


Conexiones: sockets (servidor) # Servidor de Ecos import socket HOST = '' # todas las interfases PORT = 50007 # puerto no privilegiado (>1024) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) # me vinculo al host/puerto s.listen(1) # escucho por conexiones conn, addr = s.accept() # acepto la conexi贸n print 'Connectado de', addr while 1: data = conn.recv(1024) # recibo datos if not data: break conn.send(data) # envio datos conn.close() # cierro el socket


Conexiones: sockets (cliente) # Cliente de Eco import socket HOST = 'localhost' # equipo remoto PORT = 50007 # puerto del servidor s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) # me conecto s.send('Hola mundo') # envĂ­o datos data = s.recv(1024) # recibo datos s.close() # cierro el socket print 'Recibido:', repr(data)


Conexiones asincr贸nicas: asyncore import 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()


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.reason 200 OK >>> data1 = r1.read()


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()


Internet: analizador de pรกginas html / xhtml from HTMLParser import HTMLParser from 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')


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]}]'


Internet: correo electr贸nico (smtp) email: objetos para construir correos electr贸nicos smtplib: cliente smtp para transferir mails import smtplib from email.mime.text import MIMEText # creo el mail msg = MIMEText("Mensaje de texto") msg['Subject'] = 'Motivo del mail' msg['From'] = "remitente@prueba.com" msg['To'] = "destinatario@prueba.com" # envio el mail smtp = smtplib.SMTP("smtp.prueba.com.ar") smtp.sendmail(msg['From'], msg['To'], msg.as_string())


Internet: correo electr贸nico (pop3 e imap) import poplib, imaplib, getpass m = poplib.POP3('localhost') # conexi贸n m.user(getpass.getuser()) # inicio sesi贸n m.pass_(getpass.getpass()) numMessages = len(m.list()[1]) # cantidad de mails print 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 msg for 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()


Internet: servidor correo electr贸nico (smtp) import smtpd import 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()


Internet: mails multiparte (ej. imagenes) import email.mime msg = email.mime.Multipart.MIMEMultipart() msg['Subject'] = 'Esto es una prueba' msg['From'] = 'yo@example.com' msg['Reply-to'] = 'responder-aca@example.com' msg['To'] = 'vos@example.com' 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()


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 24418 drwxrwsr-x 5 ftp-usr pdmaint 1536 Mar 20 09:48 README >>> ftp.retrbinary('RETR README', open('README', 'wb').write) '226 Transfer complete.' >>> ftp.quit()


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 planilla for fila in csv_reader: # leer las columnas y asignarlas a las variables celda1, celda2, celda3 ... = fila # muestro las celdas print celda1, celda2


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.tagName u'myxml' >>> node.childNodes[0].nodeValue u'Some data'


Archivos estrucutrados binarios: struct import struct datos = open('miarchivo.zip', 'rb').read() inicio = 0 for 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


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


Compresi贸n con zip: zipfile import zipfile file = zipfile.ZipFile("ejemplo.zip", "r") # listar nombres de archivos for name in file.namelist(): print name, # listar informaci贸n de archivos zipeados for info in file.infolist(): print info.filename, info.date_time, info.file_size # leo los archivos comprimidos for name in file.namelist(): data = file.read(name) print name, len(data), repr(data[:10])


Registro: logging import logging logging.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')


Depuraci贸n: pdb Funciones de pdb: set_trace(): comienza depuraci贸n pm(): comienza modo post-mortem run(orden): ejecuta orden en depuraci贸n import pdb for i in xrange(1000): if i==500: pdb.set_trace() > debug.py(3)<module>() -> for i in xrange(1000): (Pdb) p i 500 (Pdb) c


Depuración: pdb Comandos principales de pdb: p: imprime contenido de expresión s: ejecuta entrando a las funciones n: ejecuta hasta la próxima linea c: continua con la ejecución normal r: ejecuta hasta finalizar la función w: muestra la traza actual l: lista el código fuente b: inserta una interrupción para el archivo y linea j: salta a una linea predeterminada q: termina el programa


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 integradas doctest.testmod()


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

import unittest class 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 pruebas unittest.main()


Documentaci贸n y Ayuda Documentaci贸n Oficial: http://docs.python.org/ Libro Python para todos Python Argentina: Aprendiendo Python

programacion en python parte 2  

como programar en python.

Read more
Read more
Similar to
Popular now
Just for you