Aller au contenu

📑 Les fichiers csv et json⚓︎

Découverte⚓︎

Le site data.gouv propose de nombreux jeux de données en libre accès.

Les fichiers correspondants sont souvent proposés aux formats

  • csv pour Comma Separated Values,
  • json pour JavaScript Object Notation.

Ces deux formats de fichiers permettent de présenter des données textuelles. Voici par exemple les mêmes informations présentées dans chacun des formats :

  • au format csv (le fichier s'appelle amis.csv):

    📑 Données CSV
    nom,âge,ville,passion
    Jean,26,Paris,VTT
    Marion,28,Lyon,badminton
    
  • au format json (le fichier s'appelle amis.json):

    📑 Données json
    { "amis": [
        {"nom": "Jean","âge": 26,"ville": "Paris","passion": "VTT"},
        {"nom": "Marion","âge": 28,"ville": "Lyon","passion": "badminton"},
              ]
    }
    

Nous travaillerons désormais avec les fichiers csv. L'exemple précédent permet de remarquer plusieurs choses :

  • un fichier csv contient des données textuelles,

  • les données sont organisées en lignes,

  • la première ligne regroupe le nom des descripteurs (il y en a quatre ici : nom, âge, ville et passion),

  • les autres lignes contiennent des enregistrements (il y en a deux ici : Jean,26,Paris,VTT et Marion,28,Lyon,badminton),

  • au sein de chaque ligne, les valeurs sont délimitées par un séparateur (ici le caractère ","),

  • les données peuvent être de types différents. Ici le nom, la ville et la passion sont des chaînes de caractères, l'âge un entier.

Attention

La réalité n'est pas aussi simple :

  • il arrive que la première ligne ne contienne pas les entêtes. Ils peuvent être listés dans un fichier annexe ou... perdus !

  • on trouve parfois une seconde ligne contenant les types des données (entier, texte...).

  • le séparateur n'est pas toujours une virgule. Il est courant que l'on trouve des ";" dans les fichiers français car la virgule est utilisée comme séparateur décimal.

Premiers contacts

On considère les deux fichiers csv ci-dessous (on n'en donne que les trois première lignes) :

📑 Données CSV
geo_point_2d;nb_equipement;commune;cp
(47.3392380011,0.7162219998);1;Chambray-lès-Tours;37170
(47.3300100011,0.6120900019);5;Ballan-Miré;37510
📑 Données CSV
session,academie,sexe,diplome_specialite,nombre_d_inscrits,nombre_d_admis_totaux
INT,TEXT,TEXT,TEXT,INT,INT
2021,AIX-MARSEILLE,FILLES,BAC PRO AG 21302 GEST MILIEUX NATURELS FAUNE,16,13

Cochez la ou les bonnes réponses.

  • Le séparateur du fichier petanque.csv est la virgule
  • Le fichier petanque.csv compte quatre descripteurs
  • Le séparateur du fichier bac.csv est la virgule
  • INT est un descripteur du fichier bac.csv
  • ❌ Le séparateur du fichier petanque.csv est le point-virgule
  • ✅ Le fichier petanque.csv compte bien quatre descripteurs
  • ✅ Le séparateur du fichier bac.csv est bien la virgule
  • ❌ INT est un type de données
Problème !

On propose ci-dessous un extrait d'un fichier csv. Identifiez les trois problèmes présents :

📑 Données CSV
nom,prenom,identifiant;mdp,derniere_connexion
Clark,Sarah,sclark,k012345,20230105,
Mapple,Marc,marc.mapple,20221231
Solution
  1. Le séparateur n'est pas constant : il y a un point-virgule dans la première ligne
  2. Il y a une virgule en trop en fin de deuxième ligne
  3. Il manque un champs sur la troisième ligne

On pourrait aussi noter le gros problème qui consiste à stocker les mots de passe des utilisateurs en clair dans un fichier !

Autres formats...

Les fichiers csv et json ne sont pas les seuls formats permettant de conserver des données.

On peut aussi retenir le format xml pour eXtensible Markup Language qui utilise des balises au même titre que le html :

📑 Données XML
<?xml version="1.0" encoding="UTF-8"?>
<amis>
    <personne>
        <nom>Jean</nom>
        <âge>26</âge>
        <ville>Paris</ville>
        <passion>VTT</passion>
    </personne>
    <personne>
        <nom>Marion</nom>
        <âge>28</âge>
        <ville>Lyon</ville>
        <passion>badminton</passion>
    </personne>
</amis>

Création⚓︎

On l'a dit, les fichiers csv et json sont des fichiers « texte » classique. Il est donc possible de les créer avec un simple éditeur de texte.

Création d'un fichier csv

« Créer » un fichier csv

On souhaite « créer » un fichier csv recensant les jours fériés en France durant l'année 2023.

Afin de rester dans l'interface proposée par ce site nous travaillerons dans un éditeur Python.

Pour de vrai !

Au lieu de travailler dans l'éditeur Python proposé ci-dessous, vous pouvez utiliser votre propre éditeur et réellement créer le fichier csv en l'enregistrant avec l'extension .csv. Vous pourrez ensuite le lire comme vu plus haut. Remarquez qu'un "copié/collé" de cet écran peut vous faire gagner du temps. Il faudra juste le transformer un peu ...

Ces jours sont présentés dans le tableau ci-dessous :

motif jour numero mois
Jour de l'an dimanche 1 janvier
Lundi de Pâques lundi 10 avril
Fête du travail lundi 1 mai
Victoire 1945 lundi 8 mai
Ascension jeudi 18 mai
Fête Nationale vendredi 14 juillet
Assomption mardi 15 août
Toussaint mercredi 1 novembre
Armistice 1918 samedi 11 novembre
Noël lundi 25 décembre

Compléter la chaîne de caractère contenu ci-dessous en saisissant le contenu du fichier csv :

  • on saisira les descripteurs sur la première ligne,
  • on utilisera la virgule comme séparateur.

Vous pouvez saisir les descripteurs dans l'ordre que vous souhaitez, il faut par contre faire en sorte de saisir les valeurs dans le même ordre !

###
attendu = [bksl-nl {"motif": "Jour de l'an", "jour": "dimanche", "numero": "1", "mois": "janvier"},bksl-nl {"motif": "Lundi de Pâques", "jour": "lundi", "numero": "10", "mois": "avril"},bksl-nl {"motif": "Fête du travail", "jour": "lundi", "numero": "1", "mois": "mai"},bksl-nl {"motif": "Victoire 1945", "jour": "lundi", "numero": "8", "mois": "mai"},bksl-nl {"motif": "Ascension", "jour": "jeudi", "numero": "18", "mois": "mai"},bksl-nl {"motif": "Fête Nationale", "jour": "vendredi", "numero": "14", "mois": "juillet"},bksl-nl {"motif": "Assomption", "jour": "mardi", "numero": "15", "mois": "août"},bksl-nl {"motif": "Toussaint", "jour": "mercredi", "numero": "1", "mois": "novembre"},bksl-nl {"motif": "Armistice 1918", "jour": "samedi", "numero": "11", "mois": "novembre"},bksl-nl {"motif": "Noël", "jour": "lundi", "numero": "25", "mois": "décembre"},bksl-nl]bksl-nlbksl-nlimport csvbksl-nlbksl-nlcontenu = contenu.strip()bksl-nllignes = contenu.splitlines()bksl-nllecteur = csv.DictReader(lignes, delimiter=",")bksl-nlcontenu = [dico for dico in lecteur]bksl-nlbksl-nlassert contenu == attendu, "Erreur lors de la création"bksl-nlbksl-nl 5/5
contenu = """bksl-nl# Effacer cette ligne et saisir le contenu du fichierbksl-nl"""bksl-nlbksl-nlcontenu = """bksl-nlmotif,jour,numero,moisbksl-nlJour de l'an,dimanche,1,janvierbksl-nlLundi de Pâques,lundi,10,avrilbksl-nlFête du travail,lundi,1,maibksl-nlVictoire 1945,lundi,8,maibksl-nlAscension,jeudi,18,maibksl-nlFête Nationale,vendredi,14,juilletbksl-nlAssomption,mardi,15,aoûtbksl-nlToussaint,mercredi,1,novembrebksl-nlArmistice 1918,samedi,11,novembrebksl-nlNoël,lundi,25,décembrebksl-nl"""bksl-nlbksl-nl

A

Comme indiqué dans l'énoncé, l'ordre des descripteurs n'a pas d'importance. Il faut simplement être cohérent :

🐍 Script Python
contenu = """
numero,mois,motif,jour
1,janvier,Jour de l'an,dimanche
10,avril,Lundi de Pâques,lundi
1,mai,Fête du travail,lundi
8,mai,Victoire 1945,lundi
18,mai,Ascension,jeudi
14,juillet,Fête Nationale,vendredi
15,août,Assomption,mardi
1,novembre,Toussaint,mercredi
11,novembre,Armistice 1918,samedi
25,décembre,Noël,lundi
"""

Z

« Créer » un fichier json

On souhaite « créer » un fichier json recensant les jours fériés en France durant l'année 2023. Ces jours sont présentés dans le tableau ci-dessous :

motif jour numero mois
Jour de l'an dimanche 1 janvier
Lundi de Pâques lundi 10 avril
Fête du travail lundi 1 mai
Victoire 1945 lundi 8 mai
Ascension jeudi 18 mai
Fête Nationale vendredi 14 juillet
Assomption mardi 15 août
Toussaint mercredi 1 novembre
Armistice 1918 samedi 11 novembre
Noël lundi 25 décembre

Compléter le dictionnaire contenu ci-dessous en saisissant le contenu du fichier json.

Ce dictionnaire contient une unique clé jours_fériés pour laquelle la valeur associée est une liste.

Chacun des éléments de cette liste est un dictionnaire contenant les couples descripteur: valeur.

L'ordre est important !

Les données étant saisies dans une liste, leur ordre importe.

Vous devez donc saisir les lignes dans l'ordre dans lequel elles apparaissent dans le tableau ci-dessus.

###
attendu = {bksl-nl "jourspy-undfériés": [bksl-nl {"motif": "Jour de l'an", "jour": "dimanche", "numero": "1", "mois": "janvier"},bksl-nl {"motif": "Lundi de Pâques", "jour": "lundi", "numero": "10", "mois": "avril"},bksl-nl {"motif": "Fête du travail", "jour": "lundi", "numero": "1", "mois": "mai"},bksl-nl {"motif": "Victoire 1945", "jour": "lundi", "numero": "8", "mois": "mai"},bksl-nl {"motif": "Ascension", "jour": "jeudi", "numero": "18", "mois": "mai"},bksl-nl {"motif": "Fête Nationale", "jour": "vendredi", "numero": "14", "mois": "juillet"},bksl-nl {"motif": "Assomption", "jour": "mardi", "numero": "15", "mois": "août"},bksl-nl {"motif": "Toussaint", "jour": "mercredi", "numero": "1", "mois": "novembre"},bksl-nl {"motif": "Armistice 1918", "jour": "samedi", "numero": "11", "mois": "novembre"},bksl-nl {"motif": "Noël", "jour": "lundi", "numero": "25", "mois": "décembre"},bksl-nl ]bksl-nl}bksl-nlbksl-nlassert contenu == attendu, "Erreur lors de la création"bksl-nlbksl-nl 5/5
contenu = {bksl-nl "jourspy-undfériés": [bksl-nl {"motif": "Jour de l'an", "jour": "dimanche", "numero": 1, "mois": "janvier"},bksl-nl ...bksl-nl ]bksl-nl}bksl-nlbksl-nlcontenu = {bksl-nl "jourspy-undfériés": [bksl-nl {"motif": "Jour de l'an", "jour": "dimanche", "numero": "1", "mois": "janvier"},bksl-nl {"motif": "Lundi de Pâques", "jour": "lundi", "numero": "10", "mois": "avril"},bksl-nl {"motif": "Fête du travail", "jour": "lundi", "numero": "1", "mois": "mai"},bksl-nl {"motif": "Victoire 1945", "jour": "lundi", "numero": "8", "mois": "mai"},bksl-nl {"motif": "Ascension", "jour": "jeudi", "numero": "18", "mois": "mai"},bksl-nl {"motif": "Fête Nationale", "jour": "vendredi", "numero": "14", "mois": "juillet"},bksl-nl {"motif": "Assomption", "jour": "mardi", "numero": "15", "mois": "août"},bksl-nl {"motif": "Toussaint", "jour": "mercredi", "numero": "1", "mois": "novembre"},bksl-nl {"motif": "Armistice 1918", "jour": "samedi", "numero": "11", "mois": "novembre"},bksl-nl {"motif": "Noël", "jour": "lundi", "numero": "25", "mois": "décembre"},bksl-nl ]bksl-nl}bksl-nlbksl-nl

A

Z