Accéder à la console Python

Pour accéder à la console Python de Gnumeric, il faut tout d'abord installer les greffons Python plugin et Python plugin loader. Sous Debian, ceux-ci sont disponibles par l'installation du paquet gnumeric-plugins-extra.

Une fois lesdits greffons installés, il faut aller les activer en passant par Outils > Greffons puis en cochant Chargeur de greffon Python. Après redémarrage de Gnumeric, la console Python devrait être directement accessible par une entrée du menu Outils.

Le site de Gnumeric propose un tutoriel pour activer la console mais il semble un peu dépassé ou bien pas adapté au packaging Debian.

Jouer avec la console

Pour mon cas test, j'avais un besoin très simple. J'avais construit un fichier Gnumeric avec plusieurs feuilles dont l'une d'elle contenait une liste d'adresses Web. Je souhaitais obtenir la liste ordonnée des top domaines de ces adresses.

Première étape, récupérer la feuille où se trouvent mes données :

# Chargement du module pour accéder à l'API gnumeric
import Gnumeric
 
# Récupération du classeur
# (j'ai une seule instance d'ouverte, il s'agit donc du premier)
wb = Gnumeric.workbooks()[0]
 
# Recherche de ma feuille
[s.get_name_unquoted() for s in wb.sheets()]
# ... que j'identifie comme la première
sheet = wb.sheets()[0]

Premier constat, un interpréteur Python auquel on ne peut soumettre qu'une ligne à la fois ce n'est vraiment pas très pratique.

Je souhaite maintenant accéder aux données de la colonne C :

# Accès au contenu de C2
sheet[2,1].get_value()
 
# Récupération de l'ensemble des données dans une liste
# (one-liner à cause de l'interpréteur)
l = [sheet[2,i].get_value() for i in range(5000) if not sheet[2,i].get_value() is None]
# len(l) -> 4977 ce qui correspond à ce que j'attends

Et finalement je peux réaliser mon opération :

# utilisation d'urlparse pour parser les urls
from urlparse import urlparse
 
# récupération des top domaines
# (désolé, encore un one-liner)
domains = [".".join(urlparse(u).netloc.split(".")[-2:]) for u in l]
 
# comptage
occ = dict([(d, domains.count(d)) for d in set(domains)])
 
# classement
from operator import itemgetter
sdomains = sorted(occ.items(), key=itemgetter(1), reverse=True)

Et voilà...

Piloter le contenu d'un tableur à partir d'une console python peut parfois être très intéressant. Pour autant, limiter le champs de l'interpréteur à une seule ligne ne rend pas la chose très aisée.