Megacurso programación en Python3 | 2. Utilidades generales
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.