SlideShare ist ein Scribd-Unternehmen logo
1 von 44
Downloaden Sie, um offline zu lesen
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:pruebami-archivo.txt'
>>> os.path.exists('C:pruebami-archivo.txt')
False
>>> os.path.splitext('mi-archivo.txt')
('mi-archivo', '.txt')
>>> os.path.dirname('C:pruebami-archivo.txt')
'C:prueba'
>>> os.path.basename('C:pruebami-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 %sn%sn' % (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

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (18)

Entrega de reporte no 1, lab 1
Entrega de reporte no 1, lab 1Entrega de reporte no 1, lab 1
Entrega de reporte no 1, lab 1
 
Lab
LabLab
Lab
 
Programa que suma y multiplica
Programa que suma y multiplicaPrograma que suma y multiplica
Programa que suma y multiplica
 
Informe minishell
Informe minishellInforme minishell
Informe minishell
 
Pila
PilaPila
Pila
 
Java Applet:::Pelota que rebota en un recinto.
Java Applet:::Pelota que rebota en un recinto.Java Applet:::Pelota que rebota en un recinto.
Java Applet:::Pelota que rebota en un recinto.
 
Pensando funcionalmente
Pensando funcionalmentePensando funcionalmente
Pensando funcionalmente
 
Programación C++
Programación C++Programación C++
Programación C++
 
Resumen scripts unix
Resumen scripts unixResumen scripts unix
Resumen scripts unix
 
Tut2q4
Tut2q4Tut2q4
Tut2q4
 
Ejemplos Importantisimo
Ejemplos  ImportantisimoEjemplos  Importantisimo
Ejemplos Importantisimo
 
Alfabeto
AlfabetoAlfabeto
Alfabeto
 
Linux basico-6.PDF
Linux basico-6.PDFLinux basico-6.PDF
Linux basico-6.PDF
 
Quasi - Practicas de Programacion en C
Quasi - Practicas de Programacion en CQuasi - Practicas de Programacion en C
Quasi - Practicas de Programacion en C
 
Computacion funciones definidas por el programador
Computacion funciones definidas por el programadorComputacion funciones definidas por el programador
Computacion funciones definidas por el programador
 
Practicas programacion 1 10
Practicas programacion 1 10Practicas programacion 1 10
Practicas programacion 1 10
 
Analisis programacion de pc.
Analisis programacion de pc.Analisis programacion de pc.
Analisis programacion de pc.
 
Procesamiento de datos
Procesamiento de datosProcesamiento de datos
Procesamiento de datos
 

Ähnlich wie Programacion en python_2

Programacion en python_1
Programacion en python_1Programacion en python_1
Programacion en python_1
wozgeass
 

Ähnlich wie Programacion en python_2 (20)

Programacion en python_1
Programacion en python_1Programacion en python_1
Programacion en python_1
 
ECMAScript 6
ECMAScript 6ECMAScript 6
ECMAScript 6
 
2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby
 
Python workshop
Python workshopPython workshop
Python workshop
 
Ficheros C++
Ficheros C++Ficheros C++
Ficheros C++
 
Python3000
Python3000Python3000
Python3000
 
19 javascript servidor
19 javascript servidor19 javascript servidor
19 javascript servidor
 
08 strings o cadenas
08 strings o cadenas08 strings o cadenas
08 strings o cadenas
 
Codigos de programas
Codigos de programasCodigos de programas
Codigos de programas
 
Codigos de programas
Codigos de programasCodigos de programas
Codigos de programas
 
Codigos de programas
Codigos de programasCodigos de programas
Codigos de programas
 
6.funciones y recursividad en c++
6.funciones y recursividad en c++6.funciones y recursividad en c++
6.funciones y recursividad en c++
 
Presentacion Python
Presentacion  Python Presentacion  Python
Presentacion Python
 
Lecture 37
Lecture 37Lecture 37
Lecture 37
 
Java 8
Java 8Java 8
Java 8
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
Lw2010 Pedro Valera
Lw2010 Pedro ValeraLw2010 Pedro Valera
Lw2010 Pedro Valera
 
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En RedesLw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
 
C++ y sus librerias
C++ y sus libreriasC++ y sus librerias
C++ y sus librerias
 
Sesion12.pdf
Sesion12.pdfSesion12.pdf
Sesion12.pdf
 

Mehr von wozgeass (10)

Revista Linux Latino No.1
Revista Linux Latino No.1Revista Linux Latino No.1
Revista Linux Latino No.1
 
Revista Python entre todos No.1
Revista Python entre todos No.1Revista Python entre todos No.1
Revista Python entre todos No.1
 
Aztli diseño bueno
Aztli diseño buenoAztli diseño bueno
Aztli diseño bueno
 
Vista sucks
Vista sucksVista sucks
Vista sucks
 
24 33 -_metasploit
24 33 -_metasploit24 33 -_metasploit
24 33 -_metasploit
 
Cultivandolanoosfera
CultivandolanoosferaCultivandolanoosfera
Cultivandolanoosfera
 
La catedral y el bazar
La catedral y el bazarLa catedral y el bazar
La catedral y el bazar
 
La catedral y el bazar
La catedral y el bazarLa catedral y el bazar
La catedral y el bazar
 
Programacion Orientada a Objetos en python
Programacion Orientada a Objetos en pythonProgramacion Orientada a Objetos en python
Programacion Orientada a Objetos en python
 
Programacion en python_3
Programacion en python_3Programacion en python_3
Programacion en python_3
 

Kürzlich hochgeladen

NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdfNUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
UPTAIDELTACHIRA
 
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptxRESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
pvtablets2023
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
EliaHernndez7
 

Kürzlich hochgeladen (20)

PLAN DE REFUERZO ESCOLAR MERC 2024-2.docx
PLAN DE REFUERZO ESCOLAR MERC 2024-2.docxPLAN DE REFUERZO ESCOLAR MERC 2024-2.docx
PLAN DE REFUERZO ESCOLAR MERC 2024-2.docx
 
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdfNUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
 
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdfPlan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
 
Sesión de clase APC: Los dos testigos.pdf
Sesión de clase APC: Los dos testigos.pdfSesión de clase APC: Los dos testigos.pdf
Sesión de clase APC: Los dos testigos.pdf
 
Infografía EE con pie del 2023 (3)-1.pdf
Infografía EE con pie del 2023 (3)-1.pdfInfografía EE con pie del 2023 (3)-1.pdf
Infografía EE con pie del 2023 (3)-1.pdf
 
Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024
 
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptxRESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
 
Tema 10. Dinámica y funciones de la Atmosfera 2024
Tema 10. Dinámica y funciones de la Atmosfera 2024Tema 10. Dinámica y funciones de la Atmosfera 2024
Tema 10. Dinámica y funciones de la Atmosfera 2024
 
Biografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdfBiografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdf
 
Usos y desusos de la inteligencia artificial en revistas científicas
Usos y desusos de la inteligencia artificial en revistas científicasUsos y desusos de la inteligencia artificial en revistas científicas
Usos y desusos de la inteligencia artificial en revistas científicas
 
Lecciones 06 Esc. Sabática. Los dos testigos
Lecciones 06 Esc. Sabática. Los dos testigosLecciones 06 Esc. Sabática. Los dos testigos
Lecciones 06 Esc. Sabática. Los dos testigos
 
Supuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docxSupuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docx
 
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
 
Revista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdfRevista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdf
 
Power Point E. S.: Los dos testigos.pptx
Power Point E. S.: Los dos testigos.pptxPower Point E. S.: Los dos testigos.pptx
Power Point E. S.: Los dos testigos.pptx
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
 
INSTRUCCION PREPARATORIA DE TIRO .pptx
INSTRUCCION PREPARATORIA DE TIRO   .pptxINSTRUCCION PREPARATORIA DE TIRO   .pptx
INSTRUCCION PREPARATORIA DE TIRO .pptx
 
TIENDAS MASS MINIMARKET ESTUDIO DE MERCADO
TIENDAS MASS MINIMARKET ESTUDIO DE MERCADOTIENDAS MASS MINIMARKET ESTUDIO DE MERCADO
TIENDAS MASS MINIMARKET ESTUDIO DE MERCADO
 
SESION DE PERSONAL SOCIAL. La convivencia en familia 22-04-24 -.doc
SESION DE PERSONAL SOCIAL.  La convivencia en familia 22-04-24  -.docSESION DE PERSONAL SOCIAL.  La convivencia en familia 22-04-24  -.doc
SESION DE PERSONAL SOCIAL. La convivencia en familia 22-04-24 -.doc
 
La Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración AmbientalLa Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración Ambiental
 

Programacion en python_2

  • 1. Programación en Python Parte 2 Mariano Reingart reingart@gmail.com
  • 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 defecto Algunos modulos depende de la plataforma (ej. winreg) Documentada en la Referencia Standard Library Más de 300 módulos!
  • 3. 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
  • 4. 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
  • 5. 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
  • 6. 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'
  • 7. 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 ...>
  • 8. 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!
  • 9. 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
  • 10. 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()
  • 11. 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'
  • 12. 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")
  • 13. 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
  • 14. 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
  • 15. 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
  • 16. 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)
  • 17. 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:pruebami-archivo.txt' >>> os.path.exists('C:pruebami-archivo.txt') False >>> os.path.splitext('mi-archivo.txt') ('mi-archivo', '.txt') >>> os.path.dirname('C:pruebami-archivo.txt') 'C:prueba' >>> os.path.basename('C:pruebami-archivo.txt') 'mi-archivo.txt'
  • 18. 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)
  • 19. 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)
  • 20. 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.'
  • 21. 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
  • 22. 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
  • 23. 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)
  • 24. 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()
  • 25. 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()
  • 26. 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()
  • 27. 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')
  • 28. 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]}]'
  • 29. 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())
  • 30. 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 %sn%sn' % (num, data[0][1]) m.close() m.logout()
  • 31. 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()
  • 32. 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()
  • 33. 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()
  • 34. 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
  • 35. 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'
  • 36. 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
  • 37. 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
  • 38. 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])
  • 39. 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')
  • 40. 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
  • 41. 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
  • 42. 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()
  • 43. 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()
  • 44. Documentación y Ayuda Documentación Oficial: http://docs.python.org/ Libro Python para todos Python Argentina: Aprendiendo Python