YAML, XML, JSON, CSV, INI… Qu’est-ce que c’est et à quoi ça sert ? 28


Que voilà de jolis acronymes !

Quand j’ai débuté la programmation, je les rencontrais partout sur le net. On en parlait comme si on parlait d’acheter du pain. Apparemment c’était évident pour tout le monde.

Ça m’a énervé, mais ça m’a énervé !

Et puis j’ai oublié. C’est devenu tellement le quotidien pour moi, tellement banal… Jusqu’à ce que je reçoive ce mail :

Je viens vous quémander un article

Il y a une question que je me pose assez souvent avant de coder quelque chose et bien que j’ai pu me faire quelques opinions au fil du temps, je n’ai jamais trouvé un article ou une conf ou que sais-je qui explique ça clairement.

Ma question concerne le format d’écriture des données.
Entre les fichiers textes genre ini, json, xml, yaml (que j’aime bien), les formats binaires (pickle, voir hdf5 pour les scientifiques et j’en ignore peut être d’autre…), les bases de données mysql, postgre, sqlite.

Je n’ai pas les idées claires sur :
* cas typique d’utilisation
* les plus et les moins
* la corruptibilité
* la sécurité (point fourre-tout)

En gros, mon raisonnement de béotien dit : binaire plus performant que texte mais texte lisible par l’éditeur et ça, ça rassure.

A prendre ou à jeter

Aujourd’hui, je vais donc parler des formats texte, et je ferai un article sur les formats binaires plus tard.

Formats

YAML, XML, JSON, CSV, INI sont des noms de formats de données texte. Il y a plusieurs choses à comprendre ici:

Donnés :
Ca peut être n’importe quoi que vous vouliez sauvegarder ou transmettre : carnet d’adresses, configuration d’un logiciel, contenu d’une base de données, nom/prenom/age/mensurations, etc. Bref, tout groupe d’informations que vous souhaitez pourvoir communiquer, ou relire plus tard.
Format :
Comment sont organisées ces données. Comme on manipule les données avec un ordinateur, il est nécessaire de les ranger données d’une certaine façons. En les rangeant de cette façon, l’ordinateur, si il connait le “format”, est capable d’analyser les données qu’il reçoit. Sinon pour lui elles ne veulent rien dire.
Texte :
En opposition à “binaire” (ce qui est un abus de langage, puisque du texte en informatique, c’est du binaire). Cela signifie que votre format est organisé autour d’un texte lisible par les humains. C’est ce texte qui va dire “ceci est l’age”, “ceci est le nom”, “ceci est la taille de ses ganglions”, etc.

En résumé, un format de données texte, c’est une convention textuelle pour que des ordinateurs puissent échanger des données entre eux et que celui qui reçoit puisse retrouver la même chose que ce que l’on lui a envoyé.

Exemples

Le format XML est une convention qui dit qu’on va mettre les données (les informations qu’on transmet) entre des balises.

Les balises ont la forme suivante : < nomDeBalise >.

Une balise peut contenir une données, ou d’autres balises.

Le choix des balises est laissé à la personne qui créer le XML. Celui qui reçoit le XML doit connaître ces balises pour récupérer les données.

Imaginez un carnet d’adresses avec chaque personne ayant un nom et un numéro de téléphone. Il existe de nombreux moyens de représenter ce carnet d’adresses. L’UN des moyens de possibles, est d’écrire un fichier XML. Par exemple :

<?xml version="1.0" encoding="utf8"?>
<personnes>
    <personne>
        <nom>Sam</nom>
        <numero>555-555-555</numero>
    </personne>
    <personne>
        <nom>Max</nom>
        <numero>1234567890</numero>
    </personne>
    <personne>
        <nom>Bob</nom>
        <numero>666</numero>
    </personne>
</personnes>

Pour vous en tant qu’humain, ça n’apporte rien.

Mais quand vous avez besoin de créer un programme qui peut sauvegarder / lire ces données ou les transmettre à un autre programme (car oui, les programmes doivent pourvoir se parler entre eux, comment vous croyez que cet article arrive sur votre ordinateur ?), il va falloir choisir un format pour ces données.

Chaque format et différent, et possède des avantages et des inconvénients. On peut très bien représenter les mêmes données avec deux formats différents. Ainsi, voici le même carnet d’adresses, mais au format CSV :

"nom";"numero"
"Sam";"555-555-555"
"Max";"1234567890"
"Bob";"666"

Quel format est le meilleur ?

Il n’existe pas de “meilleur” format.

Chaque format a ses caractéristiques, et il existe de nombreux formats. En fait, il existe même des formats dans les formats, des XML avec des balises qui ont des noms standardisés par exemple. Pire, vous pouvez inventer vos propres formats. Mais à moins d’être très bon et de combler un besoin qui ne l’est pas encore, je ne vous le recommande pas.

Aussi il va vous falloir choisir un format selon votre situation. En général, on choisira parmi ces caractéristiques :

  • Facilité de manipulation : votre code va traiter ce format, donc si c’est galère à manipuler, vous allez vous faire du travail en plus.
  • Expressivité : certains formats permettent de “dire” plus de de choses que d’autres. Selon la complexité de vos données, certains seront trop simples ou trop complexes.
  • Pérennité : combien de temps ce format doit être lisible ? Et-il un standard reconnu ? Est-il beaucoup utilisé ? Est-il ouvert ? Avez-vous le droit d’utiliser ce format (car oui, il y a des questions légales) ?
  • Performance : le temps de traitement de ce format convient-il à votre usage ? La place qu’il prend sur le disque ? En RAM ? Le temps de transfert par un réseau ?

Dans notre cas, nous allons étudier des formats textes ouverts qui sont tous des standards, et lisibles par un humain. Aussi la pérennité de vos données est le moindre de vos soucis, si tant est que le créateur du format est compétent et bienveillant.

Dans cet article, nous allons en effet voir uniquement les formats texte. Je garderai les formats binaires pou un article suivant, et un dernier pour les bases de données.

Au passage, les formats textes ont tous ces caractéristiques en commun:

  • Ils sont lisibles et modifiables facilement et avec peu de moyen par les humains.
  • On peut debugger, et même bidouiller un format texte sans trop de souci, même si on a pas de lib faite pour ça.
  • Ils sont plus lents et prennent plus de place que les formats binaires.
  • On les utilisent souvent pour les exports / imports de données, les fichiers de configurations, et dans la transmission d’informations sur le Web entre deux machines.

A noter qu’au passage la sécurité et la corruptibilité ne sont pas des questions liées au format, mais à la méthode de manipulation de ces formats. Donc le choix du format ne prend pas en compte ces questions.

Le format CSV

L’acronyme CSV signifie Coma Separated Values, littéralement valeurs séparées par des virgules. C’est un des formats les plus simples que l’on puisse trouver.

Dans sa version la plus basique, c’est un format ligne à ligne, et chaque ligne représente une entrée (par exemple une personne dans un carnet d’adresses, un objet dans un catalogue, des groupes d’ingrédients dans une liste de recettes, etc).

Pour chaque entrée, il y a une série de valeur, chaque valeur est séparée par des virgules. Reprenons l’exemple du carnet d’adresse :

sam,555-555-555,5 rue des lilas
max,1234567890,thailande
bob,666,7eme cercle

Mais il peut se complexifier dès qu’on veut rajouter des valeurs plus complexes. Par exemple si elles contiennent des virgules, alors il est d’usage d’entourer les valeurs de quotes :

"sam","555-555-555","5, rue des lilas"
"max,"1234567890","Patong, thailande"
"bob","666","7eme cercle"

Le séparateur (la virgule) et les quotes peuvent être aussi un point-virgule et un quote simple, et on peut avoir n’importe quelle combinaison :

'sam','555-555-555','5, rue des lilas'
'max,'1234567890','Patong, thailande'
'bob','666','7eme cercle'
'sam';'555-555-555';'5, rue des lilas'
'max;'1234567890';'Patong, thailande'
'bob';'666';'7eme cercle'
sam;555-555-555;5, rue des lilas
max;1234567890;Patong, thailande
bob;666;7eme cercle

Il existe aussi des caractères d’échappement, des exceptions de retour à la ligne, et des programmes qui produisent des lignes avec un séparateur, puis des lignes avec un autre. Autant dire que d’un format simple, on arrive parfois à quelque chose de complexe. C’est d’ailleurs pour ça que je recommande de ne pas traiter le CSV à la main, mais d’utiliser des modules spécialisés comme csv en Python.

Sachez néanmoins que le format le plus courant est celui supporté par les tableurs (Excel, LibreOffice Calc…) utilisant des guillemets doubles et des point-virgules :

"Sam";"555-555-555";"5, rue des lilas"
"Max";"1234567890";"Patong, thailande"
"Bob";"666";"7eme cercle"

C’est donc ce format que je recommande car il est du coup très facile à lire et à modifier. Il est aussi possible de donner un nom à chaque colonne sur la première ligne :

"nom";"numero";"adresse"
"Sam";"555-555-555";"5, rue des lilas"
"Max";"1234567890";"Patong, thailande"
"Bob";"666";"7eme cercle"

Vous voudrez utiliser ce format quand :

  • Vos données sont simples et facile à représentées sous forme de tableau.
  • Vous avez pas envie de vous faire chier (TRES bonne raison).
  • Il n’y a pas d’imbrication dans vos données.
  • Vos données sont statiques (pas de vérification, pas de calculs, pas de transtypage). Bref, on les lis tel quel.
  • Vous voulez que ce soit lisible dans un tableur. Pratique pour les néophytes.

Le format INI

Le format INI, utilisé pour l’INItialisation, est surtout un format pour stocker des configurations de logiciel. On le trouve souvent dans des fichiers avec des paramètres, portant l’extension .ini, .cfg, .conf ou .txt.

Il est constitué de deux types d’élément :

  • Les en-têtes, ou sections, qui s’écrivent [nom_de_l_en_tete]. Ils servent à nommer et délimiter des groupes de valeurs.
  • Les valeurs, qui s’écrivent nom=valeur.

Les fichiers INI ne sont pas fait pour stocker des données répétitives comme des personnes d’un carnet d’adresses. Généralement, chaque entrée est unique, et représente un paramètre du programme :

[utilisateur]
nom=Sam
dossier=/home/sam
 
[dernier_acces]
jour=2013-07-06
fichier='le_plus_dur_est_derriere_toi.avi'

C’est un format simple à manipuler (et il existe un module Python pour ça) et généralement on le lit, on modifie une valeur, et on la sauvegarde.

Vous voudrez utiliser ce format quand :

  • Vous voulez sauvegarder l’état ou la configuration de votre programme.
  • Vos données sont très simples.
  • Vous êtes sous une vieille machine Windows.
  • Vous voulez tricher à Baldur’s Gate.

Le format JSON

A la base JSON, qui signifie JavaScript Object Notation, n’était pas un format destiné à être échangé, mais seulement la représentation textuelle des objets Javascript.

Il se trouve qu’avec l’age d’or du Web, et l’utilisation massive d’AJAX, il a été utilisé pour communiquer entre le navigateur et le serveur, et les gens se sont apperçu qu’il était en fait très très très pratique.

Aujourd’hui, JSON est utilisé un peu pour tout, et si vous ne savez pas trop quoi choisir comme format, choisissez JSON, il y a peu de chance de se planter.

Voilà à quoi ressemble le carnet d’adresses en JSON:

[
    {
        'nom': 'Sam',
        'numero': '555-555-555',
        'adresse': '5, rue des lilas'
    },
    {
        'nom': 'Max',
        'numero': '1234567890',
        'adresse': 'Patong, thailande'
    },
    {
        'nom': 'Bob',
        'numero': '666',
        'adresse': '7eme cercle'
    }
]

JSON est extrêmement facile à manipuler de nos jours, et l’immense majorité des langages ont un module pour ça. Python n’échappe pas à la règle.

Il est rare que JSON soit une mauvaise idée, donc je vais plutôt faire une liste de quand vous ne voulez PAS utiliser JSON :

  • Vos données vont être lues souvent pas des humains sans connaissance techniques (le CSV est plus adapté).
  • La plupart des systèmes qui vont lire ces données ont de mauvaises bibliothèques pour lire le JSON, mais de grosses facilités pour d’autres formats.
  • Le reste du système communique avec un autre format (pas la peine de cumuler 40000 formats).
  • Vous avez besoin de performances extrêmes (dans ce cas cherchez du côté des formats binaires).
  • Vous voulez stocker de grosses quantités de données ou faire des analyses complexes dessus (dans ces cas cherchez du côté des bases de données).
  • Il existe un standard qui correspond à votre usage qui n’est pas en JSON (ex: notifications : Utilisez RSS, qui est du XML, ou les emails, carnet d’adresses : utilisez ldif ou vcard, etc.)
  • Vos données sont très très complexes et demande un format plus riche, des vérifications automatiques, un typage avancé, etc. Préférez XML.

Sinon, allez-y, prenez du JSON. On peut l’utiliser pour les fichiers de configuration (comme le fait Sublime Text), comme API pour son service (ce que font presque tous les grands services du monde), pour communiquer entre plusieurs sites Web (JSONP), pour exporter / importer ses données (fixtures Django)…

Le format YAML

YAML, l’humoristique “Yet Another Markup Language” a des buts et qualités similaires au JSON, mais avec un format différent.

Voici le fichier INI, traduit en YAML (les espaces sont significatifs) :

---
utilisateur:
    nom: Sam
    dossier: /home/sam

dernier_acces:
    jour: 2013-07-06
    fichier: 'le_plus_dur_est_derriere_toi.avi'
...

Le format YAML est néanmoins plus riche que le JSON:

  • Il permet d’inclure plusieurs document dans un seul fichier en les séparant par ---
  • Il contient des types avancés comme les dates.
  • Il possède plusieurs manières d’écrire les textes multi-lignes

Globalement le YAML a été créé pour être facilement lisible et éditable par un humain, et pour cette raison la communauté Ruby l’a adopté pour ses fichiers de configuration. On retrouve donc YAML dans RubyOnRail.

Utilisez YAML quand :

  • Votre fichier est destiné à être aussi souvent lu par une machine qu’un humain et contient des types complexes.
  • Vous êtes dans un environnement Ruby (à Rome…).

Contrairement à JSON, on utilisera donc plus YAML pour la configuration que l’envoie de données.

Personnellement je ne suis pas un aficionado de YAML. Mon expérience est que sa syntaxe complexe (j’admet que l’exemple ne le laisse pas paraitre) amène souvent des grattements de tête suite à une édition malheureuse. Frustrant pour un simple fichier de config.. De plus, il faut souvent installer une lib additionnelle pour le lire. Par ailleurs, JSON – qui est en fait un subset de YAML – fait généralement très bien le boulot.

Le format XML

La fameux eXtensible Markup Language. Je ne vais pas vous faire un cours complet sur XML, car on pourrait y passer des mois, au sens propre. Ce format, aux apparences simples, a été utilisé pour des choses extrêmement complexes.

Revenons à notre exemple :

<?xml version="1.0" encoding="utf8"?>
<personnes>
    <personne>
        <nom>Sam</nom>
        <numero>555-555-555</numero>
    </personne>
    <personne>
        <nom>Max</nom>
        <numero>1234567890</numero>
    </personne>
    <personne>
        <nom>Bob</nom>
        <numero>666</numero>
    </personne>
</personnes>

< ?xml version="1.0" encoding="utf8"? > est l’en-tête du fichier, il annonce quel format de XML on va utiliser, le reste est le contenu.

Ici nous n’avons que quelques balises, mais bien entendu, les balises peuvent contenir des balises qui peuvent contenir des balises… En prime, XML autorise des attributs (nom=”valeur”), c’est à dire des valeurs sur les balises qui modifient la signification de celle-ci. Par exemple :

...
<personne>
    <nom>Bob</nom>
    <numero type="shortcode">666</numero>
</personne>
...

Enfin, XML permet ce qu’on appelle des namespaces, afin de dire que les balises correspondent à un dialecte et pas un autre.

Exemple, j’ai deux fois nom dans ce XML :

<?xml version="1.0" encoding="utf8"?>
<personnes>
    <personne>
        <nom>Sam</nom>
        <numero>555-555-555</numero>
        <ville>
            <nom>Metro peau lisse</nom>
            <coord>3.14,6.56</coord>
        </ville>
    </personne>
    <personne>
        <nom>Max</nom>
        <numero>1234567890</numero>
        <ville>
            <nom>Patong</nom>
            <coord>4.2,6.9</coord>
        </ville>
    </personne>
    <personne>
        <nom>Bob</nom>
        <numero>666</numero>
        <ville>
            <nom>Sodome</nom>
            <coord>-12,-13</coord>
        </ville>
    </personne>
</personnes>

Comment savoir pour ma machine ce que signifie, “nom” ?

Et bien je peux les namespacer, c’est à dire les lier à une URL qui pointe vers la documentation qui dit ce que signifie chaque balise, ou au moins le site de l’auteur du XML.

<?xml version="1.0" encoding="utf8"?>
<personnes xmlns:sm="http://sametmax.com" xmlns:osm="http://openstreetmap.org">
    <sm:personne>
        <sm:nom>Sam</sm:nom>
        <sm:numero>555-555-555</sm:numero>
        <sm:ville>
            <osm:nom>Metro peau lisse</osm:nom>
            <osm:coord>3.14,6.56</osm:coord>
        </sm:ville>
    </sm:personne>
    <sm:personne>
        <sm:nom>Max</sm:nom>
        <sm:numero>1234567890</sm:numero>
        <sm:ville>
            <osm:nom>Patong</osm:nom>
            <osm:coord>4.2,6.9</osm:coord>
        </sm:ville>
    </sm:personne>
    <sm:personne>
        <sm:nom>Bob</sm:nom>
        <sm:numero>666</sm:numero>
        <sm:ville>
            <osm:nom>Sodome</osm:nom>
            <osm:coord>-12,-13</osm:coord>
        </sm:ville>
    </sm:personne>
</personnes>

Et si on veut se marrer un peu plus, on peut utiliser ce qu’on appelle des DTD (ou le format plus moderne XSD) : un XML, qui définit comment doit être formé un autre XML et qui permet de vérifier cela automatiquement. Il existe également un format appelé XSLT, qui permet de définir, en XML, comment transformer un autre document XML, en un document dans un troisième format de votre choix.

Bref, le XML peut devenir très très compliqué. Si compliqué en fait, que des formats en XML, même avec leurs spécifications, deviennent difficiles à lire.

XML a été historiquement le premier format texte à être souple, extensible et interopérable. Aussi a-t-il été longtemps un format de choix pour communiquer entre machines et pour sauvegarder les configurations complexes. Aujourd’hui, sa verbosité et sa complexité ont amener les gens à se tourner massivement vers JSON, et XML n’est maintenant plus utilisé que pour les données très riches ou des raisons historiques (RSS, SOAP, etc).

Il reste un terrain où XML brille, c’est la validation de données. En effet, grâce au DTD / XSD, on peut publier un document qui permet à tout langage avec la bibliothèque appropriée, de vérifier si un XML est valide, comme un formulaire. On publie les besoins de validation une fois, et plein de langages peuvent en faire usage. C’est un vrai plus.

Je recommande rarement d’utiliser XML, c’est lourd, difficile à manipuler (malgré un très bon support général de la plupart des langages), verbeux… Difficile à un débutant de mettre les mains dans votre système quand la courbe d’apprentissage est aussi hardos.

Utilisez XML si :

  • Un des dialectes XML correspond à un standard pour votre usage (RSS / Atom).
  • Vous visez des systèmes qui utilisent historiquement XML : serveurs SOAP, environnement Java…
  • La validation des données est importante et elles seront lues par de multiples langages.

Maintenance, versioning, documentation

Ce n’est pas le tout de choisir un format, il faut maintenant s’assurer qu’on puisse l’utiliser.

Car mettre des labels à ses données, c’est bien beau, mais si le mec qui reçoit vos données ne sait pas ce que signifie ces labels, il ne peut rien en faire.

Il va donc falloir écrire une documentation pour cela. Et oui, on ne documente pas seulement son code, mais aussi ses formats !

Je vous invite aussi fortement à versionner vos formats, c’est à dire à toujours accompagner vos données (dans le fichier, via le protocole d’échange, ou dans le changelog de votre application) d’un numéro de version, ceci afin que les utilisateurs / développeurs / admin système ne se retrouvent pas couillonnés quand vous décider de modifier un peu votre format.

Sur le long terme, comme les commentaires de code, cela va vous aider vous. Mais cela rendra aussi votre projet plus accessible et attirant pour les gens de l’extérieur, ou tout simplement vos collègues.

En écrivant cela je viens de m’apercevoir que l’on a rien fait de tout cela pour 0bin. La honte…

Prochainement, les formats binaires.

28 thoughts on “YAML, XML, JSON, CSV, INI… Qu’est-ce que c’est et à quoi ça sert ?

  • N.

    Il n’y a pas de “meilleur format”, mais le XML est probablement le plus pourri !

  • Sam Post author

    Je n’irais pas jusque là. Il a été très utile à son époque. Et les standards qui ont émergé grâce à lui, comme RSS ou xHTML, on vraiment apporté beaucoup de bonnes choses.

    Enfin, pour la validation de schéma complexes indépendament de la technologie utilisée, il n’y a pour le moment rien de mieux.

    Certes, dans 99% des cas, il sera avantageusement remplacé par JSON, mais ça n’en fait pas un format “pourri”.

  • ZZelle

    XML n’est pas un format “pourri”, par contre certains l’utilisent à tort et à travers.

    Un exemple pratique est une application JAVA utilisé par des développeurs et sysadmins dont les fichiers de conf était en XML (vu la complexité JSON/YAML aurait suffi) … Les sysadmins n’étant pas familier de XML, ils contactaient le support pour des erreurs de syntaxe toutes les semaines !

    Finalement, nous avons remplacé XML par JSON … presque plus d’erreurs de syntaxe … puis par YAML pour permettre aux utilisateurs de rajouter des commentaires dans les fichiers et d’éviter les problèmes de virgules en trop/en moins (les 2 principaux défauts de JSON dans les fichiers de conf)

  • Vineus

    Pour répondre à la deuxième partie de la question (sur les formats “binaires”), on peut citer thrift (originellement développé par Facebook) et protobuf (par Google).

    Les deux formats permettent de sérialiser/désérialiser des données vers un format “binaire” beaucoup plus léger que les formats “texte” (et avec compression possible des champs pour ce qui est de protobuf). Thrift est d’ailleurs plus un framework RPC qu’un système de sérialisation, mais il fonctionne très bien pour l’échange simple de données structurées.

    Dans les deux cas, on part d’un fichier texte qui décrit le format des données échangées et on passe ce fichier de description dans un générateur de code qui produit des classes de sérialisation/désérialisation pour de multiples langages.

    Le code produit permet en général une manipulation des données sous forme d’objet dans le code et l’encodage/décodage est extrêmement performant [citation needed].

    Parmi les avantages: on peut transmettre des messages beaucoup plus légers (élément important si on paye sa bande passante et qu’on envoie un très gros volume de messages), on a une garantie de l’intégrité du message, il est possible de versionner le format (rajouter des champs est “gratuit” en terme de retro compatibilité des parsers), on a une garantie de la stabilité du format.

    Parmi les inconvénients: moins de souplesse, impossibilité de lire les message “à la main”, on doit recompiler (pour les langages compilés) lors des changements de format.

    On retrouve essentiellement ces formats dans des situations d’échange de gros volumes de données server to server “temps réel” (pas de batch possible) qui nécessite de passer par Internet (par opposition à un réseau interne)

  • Sam Post author

    Mec, quand tu cite Wikipedia, vire le “citation needed”…

  • Vineus

    J’ai pas cité wikipedia. Je n’ai juste aucune preuve (autre que l’expérience) de ce que j’avance :-)

  • mothsART

    YAML a été créé pour répondre à XML et non JSON de mon souvenir. Comparé à xml, il est incroyablement plus simple et lisible.

    Et face à Json, je le trouve aussi plus aéré.
    Je pense que Json a percé principalement à cause du javascript qui le dénominateur commun côté client : l’avenir nous réserve-t-il des remplaçants à javascript et par la même occaz à json?
    Peux d’efforts niveau javascript pour le traitement… ça ne pouvait que percer! (c’est toujours mieux de traiter des choses complexes niveau serveur, non?)
    ça ne le rend pas forcément lisible et éditable à la main pour autant.
    Quand j’ai des problèmes de dump/load dans mes fixtures Django, je préfère amplement passer du yaml pour identifier le souci rapidement.(c’est peut-être subjectif)

    D’ailleurs, il y avait (ça me parait moins actif ces derniers mois) un projet d’amélioration de YAML avec le paquet python “YAY”.
    J’aimais bien le concept (un peu le less du yaml) de minimiser les doublons au maximum.

    Après, par opposition à Ruby qui préfère utiliser Yaml pour ces fichiers de conf, beaucoup de projets python (Django, scons…) utilise directement le python pour la config : un settings.py et zou!
    C’est finalement une superbe idée car ça évite d’apprendre un truc en + et ça minimise le debuggage : franchement, vous pestez pas plus quand vous faites mumuse avec un fichier de conf en .conf/.yaml/.xml/.wtf qui revoit un traceback que quand c’est directement du python?

    Tout ça pour dire que la cible de ces fichiers (si c’est un dev, un admin…) a une importance capitale!

    J’embraille déjà sur ton prochain post : tu penses parler de bson (json binaire) et d’autres formats de données texte (xml c’est la foire : difficile d’y voir clair)… binarisé?

    Ps: je suis content de savoir que d’autres reconnaisse avoir été énervé dans leurs débuts par le manque d’infos.
    Json, c’est hype! euh, pourquoi? parce que!!

  • AlexRNL

    Dommage que vos exemple de XML ne soient pas valides (à part pour le dernier)… Un seul élément root, toujours !

  • Daïku

    Coucou !

    Un petit mot pour, peut-être, juste relever une coquille :

    c’est à dire des valeurs sur les valises qui modifient la signification de celle-ci.

    ou bien

    “c’est à dire des valeurs sur les balises qui modifient la signification de celle-ci.” ?

  • Kurkaru

    L’acronyme YAML ne veut pas dire YAML Ain’t Markup Language, maintenant ? Il me semblait avoir lu quelque part que le nom d’origine avait été remplacé…

    Même si le nom d’origine est mieux, je trouve. L’humour, saybien.

  • bobo

    Ya une introduction avec pas mal d’exemples dans le mooc de coursera:
    c’est “introduction to database”

    si vous avez un peu de temps à y consacrer, moi j’ai appris pas mal de choses desssus.

    https://www.coursera.org/course/db

    ya une grosse partie sur le sql dedans

  • tShak

    Pour l’import/export de données de sites web codés en html/PHP, le XML est-il le seul format conseillé?

  • Sam Post author

    @Vineus: au temps pour moi, la blague m’a échappé.

    @mothsART : JSON a aussi persé parce qu’il est très simple et facile à comprendre. Quand on voit une structure de donnée, on peut en une seconde savoir ce que ça va donner en le sérialisant en JSON, et inversement. Sur des YAML de plus de 5 lignes, c’est pas pareil. Pour le binaire, je sais pas encore. Je ferais à l’inspi.

    @AlexRNL + @Daïku : je vais corriger ça.

    @tShak: plutot l’inverse, le XML est le moins conseillé. Un dump SQL, un export JSON ou un scrap HTML remplissent tous la fonction mieux que le XML, avec un plus pour chacun. SQL est réimportable dans la base de donnée. JSON est plus facilement manipulable. HTML est consultable immédiatement.

  • Clem

    Un des truc cool avec json c’est qu’il n’y a pas besoin d’aller vérifier la doc tout le temps : la syntaxe est très simple (crochet, accolades, guillemets, nombres, true/false/null, c’est tout).
    on a jamais de doute genre “es-ce-que cet espace d’indentation va faire bugger le truc”, il n’y a pas d’entêté a la con qu’on doit aller cherche sur le web car on ne se souvient pas de sa syntaxe.

    le seul défaut (très chiant) il ne supporte pas les commentaires.

  • mentat

    Le GROS problème des formats texte, c’est l’encodage (sauf pour xml où il est précisé en en-tête).

    J’ai bien vu que tu avais SOIGNEUSEMENT évité les caractères accentués dans tes exemple, petit malin !

    Donc, on se retrouve avec des fichiers textes qui ne contiennent pas que de l’ascii et il faut que l’on devine l’encodage utilisé. Tu vas me dire, il suffit de demandé, mais la plupart des gens ne comprennent même pas la question…

  • Sam Post author

    @Syl: ni vu, ni connu.

    @mentat: a qui tu demandes ? Parce que je vois pas ce qu’un non informaticien ferait avec un fichier JSON ou XML. Si c’est un commercial, il peut demander à son technicien qui doit savoir ce genre de truc. Si tu interragis avec un système, c’est généralement écrit dans la doc ou c’est une infos communiquée avec le protocole. Bref, sauf gros boulet en face (et là le format binaire ne te sauvera pas, il y aura d’autres problèmes), c’est une info facile à trouver.

  • mentat

    Je pensais plutôt au format csv.
    Tu l’extrait d’un site (boutique, site internet géré par une agence…), ou un client l’extrait de son système et crois moi, les interlocuteurs ont l’impression que tu leur parles chinois.

    Le monde est truffé de gens qui utilisent des outils sans trop connaitre le détail.
    Dans un autre genre, j’ai même eu une agence qui me fournissait des images en niveaux de gris, alors que je leur demandais du noir et blanc et qui ne comprenait pas le problème.

  • kontre

    Nous on utilise pas tout ça. Il faut dire que notre programme principal est développé en interne depuis 20 ans. Y’a un paquet de standards qui n’existaient pas à l’époque. De même l’encoding, ça va ça vient (même dans les fichiers de code c’est variable, c’est dire…)

  • Gring

    Le XML est lourdingue de base, mais on peut l’alléger en utilisant les attributs. Par exemple :

    <personne nom="Sam" tel="0123456789" />

    est beaucoup plus léger que :

    <personne>
    <nom>Sam</nom>
    <tel>0123456789</tel>
    </personne>

    Sinon, pour moi, le “format” CSV est à l’échange de données ce que le fil dénudé est à la connectique.

    Il faudrait donc :
    – Brûler les novices
    – Brûler les tableurs ( qui ne comprennent que le CSV )
    – Brûler les écoles de commerce qui popularisent les tableurs pour des utilisations qui n’ont rien à voir avec des tableaux.

  • Infinita

    @Gring

    – Brûler les novices

    ça c’est pas cool, on l’a tous été un jour.

    Excel et OO comprennent le csv donc je vois pas ou est le problème. En plus c’est vraiment pratique comme format, ça évite de recoder plein de fonctions que les tableurs savent très bien faire (et coder moins de trucs, c’est moins de bugs)

    Je vois pas trop le problème qu’il y a à utiliser les tableurs pour autre chose que les tableaux. On peut faire des trucs sympa facilement et tout le monde n’est pas un programmeur.

  • mtparet

    Le fait de pouvoir utiliser des références dans YAML en fait le langage de premier choix pour écrire des fichiers de config.

    expl:

    default: &default
    host: host.com
    username: monusername
    password: monpassord

    base1:
    <<: *default
    database: base1

    base2:
    <<: *default
    database: base2

    base_prod
    <<: *default
    username: proddb
    password: prodpassword
    database: baseprod

  • Johan Puisais

    XML, le format le plus pourri ? Je crois que l’effet de mode voulu par les gros acteurs du web fonctionne à fond sur ce forum. J’ai nombre de contre exemples où XML est rapide, lisible ouvert et extensible. Ce site http://www.i-cone.net est entièrement basé sur XML / XSLT pour les données et le rendu : 93 sur 100 avec pagespeed

  • Sam Post author

    Oui, le lobbie du JSON est très puissant et il font des millions grâce à l’adoption massive du format à notre grand détrimant.

    Aujourd’hui tous ces aspects de XML sont beaucoup moins utiles, à part dans certaines situations très particulières. De plus, certains aspects comme la facilité de parsing, d’édition, de génération, d’édition manuelle et de facilité de prise en main priment sur les qualité du XML dans la plupart des cas d’usage, même hors Web. Les gens n’ont pas délaissé XML pour rien, c’est un format très très lourd à manipuler.

Leave a comment

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.