Curso Python. Volumen XVI: Librerías estándar. Parte II

Escrito por Javier Ceballos Fernández

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())&lt;/pre&gt;
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.

Últimos análisis

Valoración RZ
7
Valoración RZ
9
Valoración RZ
8
Valoración RZ
8
Valoración RZ
8
Valoración RZ
8
Valoración RZ
10