Mostra totes les entrades de Gabriel Massip Fons

Python: eliminació espais superflus

Python no té una funció específica per eliminar espais superflus (és a dir, eliminar tots els espais del principi i del final d’un text, i entre paraules deixar-hi només un espai).

Hi ha una manera molt pythònica de fer-ho:

" ".join(text_amb_espais.split())

I això és ràpid? Doncs comparem 3 alternatives amb timeit:

  • Aquesta de join i split
  • Un bucle pas a pas: mirar caràcter a caràcter si hauríem de posar-lo al resultat final, depenent de si aquest o l’anterior són espais.
  • Amb tantes substitucions com calgui de dos espais seguits a un.

El codi per mesurar-ho és:

from timeit import timeit

def eliminar_espais_split_join (text: str) -> str:
    return " ".join(text.split())

def eliminar_espais_posicio_a_posicio (text: str) -> str:
    anterior_es_espai = True
    sense_espais_redundants = ""
    for x in text:
        if x == " ":
            if not anterior_es_espai:
                sense_espais_redundants += x
                anterior_es_espai = True
        else:
            sense_espais_redundants += x
            anterior_es_espai = False

    if len(sense_espais_redundants) > 0:
        if sense_espais_redundants [-1] == " ":
            sense_espais_redundants = sense_espais_redundants[:-1]
    return sense_espais_redundants

def eliminar_espais_replace (text: str) -> str:
    r2 = text
    while (r1:= r2.replace("  ", " ")) != r2:
            r2 = r1
    if len(r2) > 0:
        if r2[0] == " ":
            r2 = r2[1:]
    if len(r2) > 0:
        if r2[-1] == " ":
            r2 = r2[:-1]
    return r2

TEXT_PROVA = "      Vivamus       quis        lacus     quis  sapien    elementum     finibus   et    sollicitudin nisi.   "

assert (eliminar_espais_posicio_a_posicio (TEXT_PROVA) == eliminar_espais_split_join(TEXT_PROVA))
assert (eliminar_espais_replace (TEXT_PROVA) == eliminar_espais_split_join(TEXT_PROVA))

EXECUCIONS = 100_000

temps = (timeit (lambda: eliminar_espais_split_join (TEXT_PROVA), number=EXECUCIONS),
         timeit (lambda: eliminar_espais_posicio_a_posicio (TEXT_PROVA), number=EXECUCIONS),
         timeit (lambda: eliminar_espais_replace(TEXT_PROVA), number=EXECUCIONS))

temps_minim = min(temps)

print (f"eliminar_espais_split_join: {temps [0] / temps_minim:.2f} vegades el mínim")
print (f"eliminar_espais_posicio_a_posicio: {temps [1] / temps_minim:.2f} vegades el mínim")
print (f"eliminar_espais_replace: {temps [2] / temps_minim:.2f} vegades el mínim")

I el resultat:

eliminar_espais_split_join: 1.00 vegades el mínim
eliminar_espais_replace: 2.25 vegades el mínim
eliminar_espais_posicio_a_posicio: 8.83 vegades el mínim

He provat algunes variants, sense que influeixin significativament en els resultats:

  • Sense fer servir l’operador walrus (notació := al while) a eliminar_espais_replace.
  • Amb substitucions de 2 i 3 espais concatenades a eliminar_espais_replace.
  • Amb un índex per accedir als diferents caràcters a posicio_a_posicio.

O sigui, he deixat l’split_join al codi, la manera més genuïna del Python és alhora la més ràpida.

Dades EXIF en imatges WhatsApp

Una fotografia que m’ha arribat per WhatsApp i que m’he passat a l’ordinador no té cap dada EXIF, ni la data / hora.

D’entrada m’ha xocat, després he vist que no està mal pensat, per privacitat. Desconec qui ho esborra: el sistema operatiu en posar-la al xat, l’aplicació WhatsApp o el meu telèfon en rebre-la o desar-la. Tampoc no sé amb quin telèfon va ser feta.

Sqlite

He passat la base de dades de fotografies a Sqlite. Fins ara havia fet servir Sqlite molt poc.

El canvi ha estst fàcil perquè tinc l’aplicació amb Sqlalchemy. He pogut canviar noms de columnes tocant només el fitxer de configuració (definició d’entitats Sqlalchemy). Traspàs de dades amb select de MySQL i insert a Sqlite.

L’aplicació funciona de meravella, i podria deixar-la així, però segueixo amb MySQL. Sqlite no em fa el pes per dos detalls, irrellevants en una aplicació com aquesta:

  • Camps de tipus text sense longitud màxima. M’agrada que el motor de base de dades comprovi aquestes restriccions, atès que en ser violades poden ser símptoma d’errors de programació.
  • Mancança de camps de tipus data, de nou “massa” responsabilitat per desenvolupador. Val a dir que amb Sqlalchemy les possibilitats que es degradi són baixes.

I potser ho passo a Firebird.

Actualització 1/10/25: Descarto Firebird, la creació de la base de dades amb Sqlalchemy no funciona.

PyQt6

M’he dedicat una part de les vacances a ordenar fotografies, fins que m’he cansat del sistema que tenia muntat a mitges amb CherryPy i MySQL: m’hi falta la part de les persones, les cerques i per la incorporació de fotos faig servir un altre programa en TKinter.

Miro opcions amb altres entorns, acabo amb PyQt6.

Amb els anys hauré passat per:

  • Base de dades Access
  • Java amb Swing. No recordo si la BD era amb Access o ho vaig passar a MySQL
  • CherryPy i MySQL
  • PyQt6 i MySQL

Segueixo amb MySQL, tot i que més endavant ho passaré a Sqlite.

Tinc la base feta (edició de les dades d’una foto). Em falten moltíssimes coses, però amb aquesta base ja és cosa d’anar completant les funcionalitats a mida que tingui humor i temps per fer-ho.

M’agrada PyQt6.

Arròs amb cassola alta

Si bé tradicionalment els arrossos es fan amb una paella, també es poden fer amb una cassola alta:

La paella va molt bé si diverses persones en mengen directament, sense plats. També té un petit avantatge en l’evaporació de l’aigua. Amb la cassola una mica alta hom guanya una mica de netedat a la cuina.

Aquesta cassola (nova) és una Kuhn Rikon; se’ls coneix sobretot per les olles de pressió, però també tenen cassoles i paeles d’acer inoxidable que van molt bé.

Nic Pizzolatto: Galveston

Nic Pizzolatto: Galveston
Ediciones Salamandra, 1ª edició, novembre de 2014
Traducció de Carles Andreu Saburit
ISBN 978-84-16310-01-2
Valoració: 4

Roy Cady és un sicari de Nova Orleans, que fa la feina bruta d’un gàngster de baixa volada. Un dia li diagnostiquen un càncer i, arran d’una mala jugada del seu cap per una dona, es veu obligat a fugir de la ciutat.

En aquest viatge l’acompanya una jove prostituta que es veu mig obligat a protegir, i que li fa replantejar-se algunes situacions. Vol fer sortir la noia de la vida que porta, i alhora ha de lluitar amb la seva malaltia i l’abús de l’alcohol.

Bons personatges, densos, complexos.

Se n’ha fet una pel·lícula dirigida per Mélainie Laurent, que (encara) no consta a la Viquipèdia en català.

Llibre distret, el recomano.

Julià de Jòdar: La pastoral catalana

Julià de Jòdar: La pastoral catalana
Raval Edicions, primera edició, gener del 2010
ISBN 978-84-8256-620-7
Valoració: 3

L’Erina i en Pau decideixen en un tres i no res d’anar a Miami durant les vacances. A Miami hi viu l’Àurea, una amiga de joventut de l’Erina, que hi va anar darrera d’en Jack, un enigmàtic (o poc clar) membre d’una agència estatal americana.

Pels correus que s’intercanvien, l’Erina pensa que l’Àurea està en una situació d’embolic mental, vital i emocional, i que necessita el seu suport.

Aquest és l’argument per iniciar una reflexió de la societat catalana, i en part de l’americana, sempre des de la visió mordaç de l’escriptor, un veterà observador/activista des de posicions d’esquerra.

El llibre no ha envellit bé… o més ben dit a la política catalana han passat tantes coses els darrers 15 anys que ha quedat desfasat: els errors o inaccions de les esquerres durant la transició queden molt, molt lluny. Per diversos motius l’he deixat pendent i l’he llegit aquest any.

Com a anècdota, aquest llibre el vaig comprar dues vegades: el primer exemplar el vaig perdre, me’l vaig deixar al tren.