Format d’écriture pour petites quantités de données

Il est fréquent d’avoir à manipuler des données qui sont trop nombreuses pour être traitées à la calculatrice, et pas assez pour mettre en place des fichiers binaires complexes. A vrai dire, c’est 99% des cas chez moi. Le big data est à la mode, les petites quantités sont mon quotidien. Je n’ai rien contre netcdf, mais c’est franchement sur dimensionné, sans compter que les formats binaires, ce n’est jamais pratique pour les petits usages.

Il y a les gens qui utilisent des tableurs, et il y a les autres comme moi qui n’aiment pas ce genre d’outil trop étriqué. Alors, les premières fois (il y a toujours une première fois), j’ai écris mes données dans un fichier texte, j’ai écris un parseur qui lit ligne par ligne, et je stockais ça dans un tableau. Je travaillais avec les données pour ensuite écrire les résultats dans stdout ou un fichier. C’est bien, mais trop long et trop fastidieux.

Ensuite, j’ai découvert les fichiers .ini. C’est normalement destiné à la configuration, mais ça peut faire son job. Pour ceux qui voudraient essayer : non, je n’écrierai pas de l’xml à la main.

Entre temps, j’ai découvert YAML pour yet another markup language. C’est lisible par tout un tas de langage dont python, ce qui est bien quand on veut faire du calcul scientifique rapide et efficace. Il y a sans doute tout un tas d’autres usages qui ne sont pas les miens.

Voici un fichier avec des données :

lame1:
    epaisseur: 3
    largeur: 10
    longueur: 100
    masse: 50
lame2:
    epaisseur: 4
    largeur: 20
    longueur: 300
    masse: 200

Le problème est simple : j’ai des lames au labo, je dois les caractériser. J’ai pris les dimensions et les poids. Je commence par deux, mais je serai amené à en ajouter d’autre au fur et à mesure de mes pérégrinations. Disons que je veux connaitre la densité.

import yaml
with open('data.ml', 'r') as data:
    doc =  yaml.load(data)
    for lame in doc:
        masse = (doc[lame]['masse'])
        epaisseur = (doc[lame]['epaisseur'])
        largeur = (doc[lame]['largeur'])
        longueur = (doc[lame]['longueur'])

        densite = masse/(epaisseur*largeur*longueur)

        print("Densité de la {0}: {1}".format(lame, densite))
 

Je vois pas mal d’avantage. Mon fichier est bien structuré, donc lisible. C’est du texte, donc versionable, facilement éditable, interopérable, durable, mangeable

L’exemple est ici simplet, le format yaml et son utilisation avec python sont illustrés ici.


Vus : 1359
Publié par François : 67