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.

<p dir="auto"><center><span><img src="https://images.hive.blog/768x0/https://s22.postimg.org/4kj1zdqvl/portada.png" srcset="https://images.hive.blog/768x0/https://s22.postimg.org/4kj1zdqvl/portada.png 1x, https://images.hive.blog/1536x0/https://s22.postimg.org/4kj1zdqvl/portada.png 2x" /> <h3><center><a href="https://github.com/mondeja/megacurso_python/tree/master/packages/utils" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Carpeta del proyecto <h5><center>En <a href="https://github.com/mondeja/megacurso_python" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">la carpeta del curso encontrarás el índice con las clases publicadas. <hr /> <h3>Funciones con directorios <h5>Path del archivo ejecutándose <p dir="auto">Esta función devuelve la ruta del archivo que se está ejecutando en ese momento. <pre><code>def actual_dir(): from os import path return path.abspath(path.join(path.dirname(__file__))) <blockquote> <p dir="auto">Para entender como funciona la biblioteca <code>path puedes acceder a <a href="https://docs.python.org/2/library/os.path.html" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">su documentación. <h5>Archivos en una carpeta <p dir="auto">La siguiente función devuelve todos los nombres de los archivos de una carpeta en una lista. Podemos pasarle los parámetros: <ul> <li><code>abs_path = True (devuelve las rutas absolutas de los archivos)<br /> = False (devuelve los nombres de los archivos) <li><code>only_files = True (devuelve sólo los archivos)<br /> = False (devuelve archivos y carpetas) <pre><code>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()] <hr /> <blockquote> <p dir="auto">En la siguiente imgen están todas las funciones:<br /> <center><span><img src="https://images.hive.blog/768x0/https://s18.postimg.org/djb8f6cgp/funciones_utiles.png" srcset="https://images.hive.blog/768x0/https://s18.postimg.org/djb8f6cgp/funciones_utiles.png 1x, https://images.hive.blog/1536x0/https://s18.postimg.org/djb8f6cgp/funciones_utiles.png 2x" /> <hr /> <h3>Petición GET <p dir="auto">En la <a href="https://github.com/mondeja/megacurso_python/blob/master/clases/clase1.md" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">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? <p dir="auto">Podemos hacer algo como lo siguiente: <pre><code>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 <p dir="auto">Con el parámetro <code>debug=True nos imprime la URL de la petición. El funcionamiento es básicamente el mismo, con <code>urlopen abrimos la url de base, le añadimos <code>? para indicar que son parámetros en el protocolo HTTP y le pasamos los parámetros formateados con <code>urlencode. <p dir="auto">Luego intentamos devolver los datos en json, excepto si nos da un <code>ValueError que devolvemos los datos en bruto. <hr /> <h3>Cronometrar función <p dir="auto">La siguiente función es un decorador y se usa para cronometrar el tiempo que tarda en ejecutarse la función que decoramos. <pre><code>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 <hr /> <h3>Imprimir fecha y hora actual en formato legible <p dir="auto">Con la biblioteca <code>datetime y usando la función <code>format podemos imprimir la fecha como queramos. <pre><code>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 <p dir="auto"><center><span><img src="https://images.hive.blog/768x0/https://s22.postimg.org/kzjgoiihd/date_Now.png" srcset="https://images.hive.blog/768x0/https://s22.postimg.org/kzjgoiihd/date_Now.png 1x, https://images.hive.blog/1536x0/https://s22.postimg.org/kzjgoiihd/date_Now.png 2x" /> <hr /> <h3>Imprimir con colores <p dir="auto">La biblioteca colorama nos permite imprimir con diferentes colores de letra, fondos y estilos. Para instalarla introducir en consola: <code>pip3 install colorama. <h5>Consultar los colores de colorama <p dir="auto">Para saber qué colores trae disponibles la bilioteca he creado esta función, que nos devuelve todas las funciones dentro de la clase <code>Back de colorama exceptuando las funciones comunes de entre dobles barrabaja. <pre><code>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) <hr /> <blockquote> <p dir="auto">Demostración de algunos colores<br /> <center><span><img src="https://images.hive.blog/768x0/https://s18.postimg.org/ffa0d71i1/colorama-demo.png" srcset="https://images.hive.blog/768x0/https://s18.postimg.org/ffa0d71i1/colorama-demo.png 1x, https://images.hive.blog/1536x0/https://s18.postimg.org/ffa0d71i1/colorama-demo.png 2x" /> <hr /> <h5>Mensaje de error de color rojo <p dir="auto">Los colores en colorama se colocan en la misma impresión, delante, junto al mensaje separado por <code>+. <pre><code>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('') <p dir="auto"><center><span><img src="https://images.hive.blog/768x0/https://s13.postimg.org/bqqmg98on/mensaje_error.png" srcset="https://images.hive.blog/768x0/https://s13.postimg.org/bqqmg98on/mensaje_error.png 1x, https://images.hive.blog/1536x0/https://s13.postimg.org/bqqmg98on/mensaje_error.png 2x" /> <blockquote> <p dir="auto">Para consultar la información sobre esta bilioteca <a href="https://github.com/tartley/colorama" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">puedes acceder a su documentación.