Curso Python. Volumen XVI: Librerías estándar. Parte II
Bienvenidos un día más al curso de Python, hoy continuaremos con las librerías estándar de Python ya que en el capítulo anterior abordamos todas las que nos parecían interesantes, para que pudierais ir asimilando y utilizando poco a poco todo lo mostrado. Así que continuemos con las librerías.
Comentaros que siempre que queráis saber cómo se utilizan las librerías solo tenéis que ejecutar el siguiente comando en la consola de Python:
help (nombre de la librería)
Si os fijáis en el artículo anterior veréis que lo utilizamos con la librería “os”.
Librerías
Datos binarios
Para manejar estos datos tenemos la librería “struct” que nos proporciona dos funciones “pack()” y “unpack()” para trabajar con formatos binarios de longitud variable. En el siguiente ejemplo os vamos a mostrar cómo leer la información de cabecera de un fichero ZIP sin utilizar la librería “zipfile”. “Pack” codifica la “H” y la “I” como números sin signo de dos bytes y cuatro bytes respectivamente. También comentaros que el símbolo “<” indica que son de tamaño estándar y en orden “Little-endian” byte:
import struct
with open('myfile.zip', 'rb') as f:
data = f.read()
start = 0
for i in range(3): # show the first 3 file headers
start += 14
fields = struct.unpack('<IIIHH', data[start:start+16])
crc32, comp_size, uncomp_size, filenamesize, extra_size = fields
start += 16
filename = data[start:start+filenamesize]
start += filenamesize
extra = data[start:start+extra_size]
print(filename, hex(crc32), comp_size, uncomp_size)
start += extra_size + comp_size # skip to the next header
Log
La librería de “logging” nos ofrece un sistema “log” completo y muy flexible. Además es muy simple, ya que los mensajes de “log” son enviados a un fichero o al “sys.stderr”. Por ejemplo:
import logging
logging.debug('Informacion de Debug)
logging.info('Mensaje informatico)
logging.warning('Warning:el fichero de configuracion %s no se ha encontrado', 'server.conf')
logging.error('Error')
logging.critical('Error critico – apagando el sistema')
Este código nos proporcionará la siguiente salida:
WARNING:root: 'Warning:el fichero de configuracion server.conf no se ha encontrado
ERROR:root:Error
CRITICAL:root: 'Error critico – apagando el sistema'
Herramientas para listas
La librería “array” nos proporciona el objeto “array()” que se comporta como una lista, que almacena la información de una manera más compacta aunque esta tiene que ser toda homogénea. En el siguiente ejemplo mostramos una “array” de números binarios sin signo de 2 bytes (typecode “H”) en vez de los 16 bytes que normalmente se utilizan si estuviéramos utilizando el tipo “int”:
>>> from array import array
>>> a = array('H', [4000, 10, 700, 22222])
>>> sum(a)
26932
>>> a[1:3]
array('H', [10, 700])
Si utilizamos el módulo “deque” incluido en la librería “collections” podremos utilizar el objeto “deque()” que nos ayudará a agregar y sacar datos de una manera rápida. Es muy utilizada en listas “LIFO” (last in first out):
>>> from collections import deque
>>> d = deque(["task1", "task2", "task3"])
>>> d.append("task4")
>>> print("Handling", d.popleft())</pre>
Handling task1
Otro modo del que se puede utilizar es para realizar búsquedas en anchura:
unsearched = deque([starting_node])
def breadth_first_search(unsearched):
node = unsearched.popleft()
for m in gen_moves(node):
if is_goal(m):
return m
unsearched.append(m)
Por último os voy a mencionar la librería “bisect”, esta librería nos proporciona herramientas para trabajar con listas ordenadas de una manera rápida y sencilla:
>>> import bisect
>>> scores = [(100, 'perl'), (200, 'tcl'), (400, 'lua'), (500, 'python')]
>>> bisect.insort(scores, (300, 'ruby'))
>>> scores
[(100, 'perl'), (200, 'tcl'), (300, 'ruby'), (400, 'lua'), (500, 'python')]
Decimales en coma flotante
Los decimales en coma flotante son muy utilizados ya que tienen diversas aplicaciones. Esta librería se puede utilizar para multiplicar decimales, cálculo de %, aplicar redondeos, etc. Además puede llegar a proporcionarnos gran exactitud
>>> from decimal import *
>>> round(Decimal('0.70') * Decimal('1.05'), 2)
Decimal('0.74')
>>> round(.70 * 1.05, 2)
0.73
>>> Decimal('1.00') % Decimal('.10')
Decimal('0.00')
>>> 1.00 % 0.10
0.09999999999999995
>>> sum([Decimal('0.1')]*10) == Decimal('1.0')
True
>>> sum([0.1]*10) == 1.0
False
Esta librería nos puede dar tanta precisión como deseemos:
>>> getcontext().prec = 36
>>> Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857')
Esto es todo por hoy, esperamos que estas librerías os faciliten la tarea de programación y os ayuden a tener nuevas ideas para complementar vuestros programas. Hay más librerías que Python nos proporciona por defecto, pero hemos querido destacar aquellas que consideramos más comunes en su uso.
Os recordamos a todos que nunca es tarde para iniciar el curso de Python ya que contamos con un índice en el que pueden encontrar todo lo que hemos ido tratando en el curso.
Via: www.redeszone.net