Megacurso programación en Python3 | 2. Utilidades generales

in #spanish7 years ago (edited)

En esta ocasión vamos a ver algunas funciones útiles que nos servirán para facilitarnos el desarrollo.

Carpeta del proyecto

En la carpeta del curso encontrarás el índice con las clases publicadas.

Funciones con directorios

Path del archivo ejecutándose

Esta función devuelve la ruta del archivo que se está ejecutando en ese momento.

def actual_dir():
    from os import path
    return path.abspath(path.join(path.dirname(__file__)))

Para entender como funciona la biblioteca path puedes acceder a su documentación.

Archivos en una carpeta

La siguiente función devuelve todos los nombres de los archivos de una carpeta en una lista. Podemos pasarle los parámetros:

  • abs_path = True (devuelve las rutas absolutas de los archivos)
    = False (devuelve los nombres de los archivos)
  • only_files = True (devuelve sólo los archivos)
    = False (devuelve archivos y carpetas)
def ls(ruta, abs_path=True, only_files=False):
    # Devuelve una lista con los archivos de un directorio
    # Con abs_path=True devuelve las rutas completas de los archivos
    # Para usar esta funcion se necesita instalar scandir
    #            pip3 install scandir
    from scandir import scandir
    from os.path import abspath
    if abs_path == True:
        if only_files == False:
            return [abspath(arch.path) for arch in scandir(ruta)]
        else:
            return [abspath(arch.path) for arch in scandir(ruta) if arch.is_file()]
    else:
        if only_files == False:
            return [arch.name for arch in scandir(ruta)]
        else:
            return [arch.name for arch in scandir(ruta) if arch.is_file()]

En la siguiente imgen están todas las funciones:


Petición GET

En la clase anterior estuvimos haciendo peticiones GET a la API de Youtube. ¿Por qué no crear una función que nos realice ese trabajo sucio, sea portable y nos prevenga de errores?

Podemos hacer algo como lo siguiente:

def GET(url_base, parms={}, debug=False):
    from urllib.parse import urlencode
    from urllib.request import  urlopen
    from json import loads

    void = ({}, None, False)
    if debug == True: 
        if parms in void:
            print(url_base)
        else:
            print(url_base + '?' + urlencode(parms))

    if parms in void:
        f = urlopen(url_base)
    else:
        f = urlopen(url_base + '?' + urlencode(parms))
    data = f.read()
    f.close()
    try:
        matches = data.decode("utf-8")
        response = loads(matches)
    except ValueError:
        response = data
    return response 

Con el parámetro debug=True nos imprime la URL de la petición. El funcionamiento es básicamente el mismo, con urlopen abrimos la url de base, le añadimos ? para indicar que son parámetros en el protocolo HTTP y le pasamos los parámetros formateados con urlencode.

Luego intentamos devolver los datos en json, excepto si nos da un ValueError que devolvemos los datos en bruto.


Cronometrar función

La siguiente función es un decorador y se usa para cronometrar el tiempo que tarda en ejecutarse la función que decoramos.

def count_time(f):
    """
    Ejecuta una función e imprime el tiempo que tarda.    
    Es un decorador. Para usarlo coloca @count_time en la
    línea anterior de la función que necesites cronometrar.
    """
    def wrapper():
        from time import time
        # Empieza a contar.
        start_time = time()
        # Toma el valor de retorno de la función original.
        ret = f()
        # Calcula el tiempo transcurrido.
        elapsed_time = time() - start_time
        print("Tiempo transcurrido: %0.10f seconds." % elapsed_time)
        return ret
    
    return wrapper

Imprimir fecha y hora actual en formato legible

Con la biblioteca datetime y usando la función format podemos imprimir la fecha como queramos.

def dateNow():
    from datetime import datetime as d
    d = d.now()
    date = '{}/{}/{} - {}:{}:{}' 
    response = date.format(d.day, d.month, d.year,
                      d.hour, d.minute, d.second)
    return response


Imprimir con colores

La biblioteca colorama nos permite imprimir con diferentes colores de letra, fondos y estilos. Para instalarla introducir en consola: pip3 install colorama.

Consultar los colores de colorama

Para saber qué colores trae disponibles la bilioteca he creado esta función, que nos devuelve todas las funciones dentro de la clase Back de colorama exceptuando las funciones comunes de entre dobles barrabaja.

def colorama_colours():
    exc = ('__class__', '__delattr__', 
        '__dict__', '__dir__', '__doc__', 
        '__eq__', '__format__', '__ge__', 
        '__getattribute__', '__gt__', '__hash__', 
        '__init__', '__le__', '__lt__', '__module__', 
        '__ne__', '__new__', '__reduce__', 
        '__reduce_ex__', '__repr__', '__setattr__', 
        '__sizeof__', '__str__', '__subclasshook__', 
        '__weakref__')
    import colorama
    dirs = dir(colorama.Back)
    response = []
    for d in dirs:
        if d not in exc:
            response.append(d)
    print(response)

Demostración de algunos colores


Mensaje de error de color rojo

Los colores en colorama se colocan en la misma impresión, delante, junto al mensaje separado por +.

from colorama import Back, Fore, Style, init
init(autoreset=True)

def warning(message):
    print('')
    print(Back.LIGHTRED_EX + Fore.YELLOW + Style.BRIGHT + str(message))
    print('')

Para consultar la información sobre esta bilioteca puedes acceder a su documentación.