Archivos de la categoría Python

paleta de colores acuarelas

Convertir archivos JPG a WebP con Python

Ahora les quiero compartir un pequeño programa en Python para convertir archivos JPG a WebP.

Primero que nada les ofrezco una disculpa a mis 4 lectores, con la depresión de la pandemia no dan muchas ganas de escribir, pero esto ya está durando mucho y no se puede estar tanto tiempo preocupado, lo que sigue es un proceso de adaptación a la nueva realidad y ni modo ¡A darle átomos!

Decidí dejar de estar ocioso y aprender una nueva habilidad. Desde hace tiempo me ha estado haciendo ojitos Pelican un generador de sitios web que utiliza Python (¡Obvio!).

Migrar este blog sería algo en exceso complicado (aunque no lo descarto), por eso decidí hacer pruebas con algo más pequeño, mi otro blog Centauro del Norte.

Las ventajas son muchas, el sitio generado no requiere una base de datos, tienes un mayor control de todos los aspectos del sitio, carga mucho más rápido, aunque eso si, requiere de más conocimientos técnicos.

WebP el formato gráfico de Google

Durante la migración quise probar algo nuevo, cambiar todos los archivos de JPG a WebP. En general son archivos más pequeños, aunque he tenido resultados mixtos en este punto. Dicen que tienen una carga más rápida y aparentemente es cierto. Lo he probado en Chrome y con Firefox y las imágenes aparece como de rayo.

Sin embargo, convertir las imágenes no era algo sencillo. WordPress guarda todas las imágenes en una carpeta que se llama uploads y para conservar algo de orden almacena los archivos en subcarpetas de año y mes.

Probablemente hay otras formas de abordar este problema pero a mi se me ocurrió hacer un programa en Python inspirado en programas que ya había hecho para otros fines.

Lo primero es establecer un directorio de trabajo, luego hacer un barrido a esa carpeta y sus subcarpetas.

Si encuentra un archivo JPG inicia una conversión y genera un archivo del mismo nombre pero con extensión WebP.

Veamos el código.

import os
from PIL import Image

carpeta_raiz = "/carpeta/de/trabajo/"

# Localizar los archivos jpg
for root, dirs, files in os.walk(carpeta_raiz):
    for file in files:
        if file.endswith(".jpg"):
            archivo = os.path.join(root, file)
            archivo_nuevo = archivo.replace('.jpg', '.webp')

            # Convertirlos a WebP
            im = Image.open(archivo).convert("RGB")
            im.save(archivo_nuevo,"webp")

            print(archivo_nuevo)        

print("¡Trabajo terminado!")

Como pueden ver es un código muy sencillo, se puede adaptar para otro tipo de conversiones sin problemas.

Una vez que tuve los archivos WebP, lo único que tuve que hacer es una búsqueda y reemplazo en los archivos markdown que sirven para generar los artículos del sitio.

Ejemplos los pueden ver en: Ex Hacienda La Loma, cuna de la División del Norte y en Mercado Municipal General Francisco Villa. Ambos artículos contienen una buena cantidad de imágenes en formato WebP y creo que tienen un tiempo de carga mucho más que razonable. Bueno, eso digo yo, porque después de la primer carga entran en el juego los cachés de los navegadores.

Espero que les sea de utilidad y procuraré escribir más seguido, que también a mi me hace falta.

coronavirus

Coronavirus, Python y como mezclarlos para obtener información sobre la pandemia.

En estos días no se habla de otra cosa que no sea del Coronavirus aka el COVID-19. Es prácticamente imposible que pasen 5 minutos sin ver una nota, meme, audio o canción relacionado con el tema.

El colmo es que me enteré de que ya hicieron un módulo para Python que obtiene los datos de como va avanzando la pandemia en el mundo con gracias a la información proporcionada por la Universidad John Hopkins.

Trasteando un poco hice un pequeño programa para monitorear el avance del coronavirus en México. El programa muestra los casos confirmados, los muertos y la tasa de mortalidad en México y el mundo.

Instalar covid

Para poder usar el módulo hay que instalarlo con pip.

pip install covid

El código es el siguiente:

from covid import Covid
import time

covid = Covid()
covid.get_data()

casos_mexico = covid.get_status_by_country_name("mexico")

confirmados_mexico = casos_mexico['confirmed']
muertos_mexico = casos_mexico['deaths']

fechahora = time.strftime("%a, %d %b %Y %H:%M:%S %Z", time.localtime(casos_mexico['last_update']/1000))

print("                          MÉXICO")
print("                         ========")
print("       Última actualización :", fechahora)
print("          Casos confirmados : %i" % (confirmados_mexico) )
print("                    Muertos : %i" % (muertos_mexico))

tasa_letalidad_mexico = (muertos_mexico/confirmados_mexico) * 100
print("          Tasa de letalidad : %4.2f %%" % (tasa_letalidad_mexico))


confirmed = covid.get_total_confirmed_cases()
deaths = covid.get_total_deaths()

tasa_letalidad_mundial = (deaths / confirmed) * 100
print("  Tasa de letalidad mundial : %4.2f %%" % (tasa_letalidad_mundial))

Como pueden ver el código es bien sencillo. Tuve más problemas en mostrar de forma correcta la fecha y hora de la última actualización que en consultar la información.

Un programa como este puede ser muy útil para recolectar información e ir construyendo gráficas.

El único problema que tengo es que no creo en las cifras oficiales. El sistema de salud mexicano viene de problemas serios de falta de medicamentos para tratamiento de niños con cáncer, cáncer de mama, falta de vacunas y un líder moral que cree que la mejor protección contra el coronavirus es un Detente del Sagrado Corazón de Jesús (no no es broma).

Así es, este es el plan del presidente contra el coronavirus.

En estos días se dio a conocer que el costo de una prueba para el COVID-19 ronda en los 8 mil pesos mexicanos, así que no creo que este gobierno con su “austeridad republicana” (porque si hay dinero pero para otras cosas cof dos bocas cooof tren maya cooooof Santa Lucía cooof camionetas para la guardia nacional y recontra cooof) tenga la intención o el compromiso de aplicar pruebas a una población que todos los años se enfrenta a influenza, AH1N1, zika, chikunguña, dengue, sarampión o envenenamiento súbito por plomo (o sea unos buenos balazos). Pero en fin, eso es otro tema.

Por cierto, ¿Alguien sabe donde venden esos Detente? es para una investigación.

Covidify

Actualización 4-abr-2020. Lamentablemente el módulo covid dejó de funcionar hace un par de días (espero que no se haya enfermado). Y al estar buscando alguna solución di con Covidify que hace un mucho mejor trabajo que el módulo anterior.

Extrae la información, hace gráficas y lo entrega todo en un resumen en Excel (se puede abrir en LibreOffice).

Resumen de datos para México sobre el COVID19.
La recolección de datos.
Casos confirmados y los nuevos casos.
¿ Y ese brinco tan enorme en los casos recuperados?

Para utilizarlo primero tiene que instalar covidify:

pip install covidify

Y directamente desde la terminal iniciar la recolección de datos. En mi caso fue algo así:

covidify run --country="Mexico" --output="/directorio/de/salida/"

En el directorio de salida que especifiquen se van a encontrar con todos los archivos que generó el programa, pero el resumen están en el archivo en Excel.

Y hoy que estuve analizando los datos, parece que hay menos enfermos de COVID19, o es eso, o se les terminaron las pruebas.

¿A qué se debe esa caída tan brusca en el número de infectados?

Recuerden seguir las recomendaciones. Quedarse en casa, lavarse frecuentemente las manos, evitar lugares concurridos y guardar la sana distancia.

Rumbos y Azimutales, un script en Python para convertirlos.

Todos hemos visto una brújula, pero pocos saben usarla correctamente (me incluyo). El detalle es que actualmente la mayoría de los teléfonos celulares cuentan con una brújula en la que la lectura es azimutal (de 0 a 360º). De esa forma es sencillo establecer una dirección (o rumbo) a partir de nuestra posición.

Brújula de una aplicación en android - Rumbos y Azimutales
Este es un ejemplo de una aplicación para android. La lectura me dice que el rumbo es de 281º.

Pero existe la costumbre de establecer un rumbo partiendo de cuadrantes, empezando por el norte o sur, indicando un número de grados hacia el este o el oeste. Por ejemplo, 281º azimutales serían N 79º W.

O sea 79º del Norte hacia el Oeste.

Si, lo se, suena algo complicado, pero este tipo de problemas me gustan mucho, mezclar algo de geometría con programación es la onda. Así que me puse a hacer un pequeño programa en Python que haga la conversión entre un rumbo azimutal (o circular) a un rumbo cuadrantal.

Las operaciones son diferentes dependiendo de en que cuadrante se encuentre la lectura azimutal. Agregué los rumbos francos que son el norte, sur, este y el oeste. Y además un mensaje de error en caso de que se introduzca un valor fuera de rango.

Una vez que hice la función, me di a la tarea de construirle una sencilla interfaz gráfica usando PySimpleGUI , no es la interfaz más bonita, pero es realmente sencillo de hacer, me tomó una mañana más o menos entenderle a la construcción de la interfaz y al manejo de eventos.

El programa haciendo la conversión de azimutales a rumbos.
El resultado de la conversión.

Les quiero pedir disculpas si no uso los términos adecuados, no soy topógrafo, así que si existe una mejor manera de nombrar las cosas o si ofrecen algún consejo en cuanto a la programación les agradeceré su comentario.

Para entender mejor.