Lecture d’un fichier texte structuré

Contexte

Un fichier texte est constitué de caractères imprimables (lettres, chiffres, ponctuation, caractères spéciaux, ...), c’est à dire représentés graphiquement par un glyphe. Par opposition, un fichier binaire est un fichier qui n’est pas interprétable directement sous forme de texte : une image, un son ou encore un autre fichier compressé.

Environnement de travail

Pour cet exercice, vous devez utiliser en priorité le fichier squelette ex08-meteo.py. IMPORTANT : Enregistrez le avec Right Click + Save Link As... pour conserver l’encodage.

Selon la convention de structuration des modules, ce fichier sera structuré en quatre parties :

  1. Imports et définition des variables globales ;
  2. Définition des fonctions secondaires ;
  3. Définition de la fonction principale ;
  4. Appel protégé de la fonction principale.

Les données utilisées pour cet exercice sont extraites de données publiques fournies par Météo France.

Elles sont stockées dans le fichier ex08-meteo-data-jan-2014.csv. Le fichier est encodé en utf8. IMPORTANT : Enregistrez le avec Right Click + Save Link As... pour conserver l’encodage.

Lecture “naïve” des données

Objectifs

L’objectif est d’écrire une fonction read_meteo_data() :

Vérifier le bon fonctionnement de la fonction en effectuant un appel depuis main() et en affichant la valeur de retour (les doctests de la fonction donnent des exemples d’appel et les valeurs de retour correspondantes).

Informations complémentaires

On parle ici de lecture “naïve” car on ne tire pas avantage de la structure des données contenues dans le fichier pour lequel:

Ces informations devront être prises en compte “manuellement”.

Utiliser la construction with pour ouvrir ce fichier. Penser à préciser le mode d’ouverture (lecture ou écriture ?) et l’encodage ;

Compte tenu de la nature de l’objet à retourner, quelle est la méthode à utiliser ? read(), readline() ou readlines() ?

Doctests

Une fois la fonction opérationnelle pour quelques arguments, ET SEULEMENT DANS CE CAS, lancer les doctests dans un terminal.

$ python -m doctest ex08_meteo.py -v

La totalité des doctests doivent réussir.

Lecture structurée des données

Objectifs

Ecrire une fonction read_csv_meteo_data() :

Vérifier le bon fonctionnement de la fonction en effectuant un appel depuis main() et en affichant la valeur de retour (les doctests de la fonction donnent des exemples d’appel et les valeurs de retour correspondantes).

Comparer le code des fonctions read_meteo_data() et read_csv_meteo_data(). Lequel vous paraît le plus concis ?

Informations complémentaires

Un fichier texte peut être structuré selon une convention qui facilite la lecture des données qu’il contient. Le format csv (Comma Separated Values) est très utilisé :

Le fichier meteo-jan-2014.csv est au format csv. On peut tirer partie de cette structuration pour améliorer un peu la lecture des données en retournant une structure plus simple à manipuler que celle obtenue dans l’exercice précédent. Pour cela, Python utilise le module csv.

Ne pas oublier d’importer le module csv qui n’est pas chargé au démarrage.

L’ouverture du fichier est identique à la version “naïve”.

Lors de l’utilisation de la fonction csv.reader(), penser à préciser le delimiter.

D’après la documentation de cette fonction, quel est l’objet retourné à la lecture de chaque ligne ?

D’après la consigne quel est le type de l’objet que doit retourner read_csv_meteo_data() ?

Doctests

Une fois la fonction opérationnelle pour quelques arguments, ET SEULEMENT DANS CE CAS, lancer les doctests dans un terminal.

$ python -m doctest ex08_meteo.py -v

La totalité des doctests doivent réussir.

Applications

L’objectif est d’écrire une fonction get_meteo_data_by_day() :

Si les paramètres d’appel ne correspondent pas à des données présentes dans le fichier, la fonction doit retourner la liste vide. Le nom de la station passé en argument doit être insensible à la casse (minuscules/majuscules).

Au vu des données contenues dans meteo-jan-2014.csv, quelle est la taille de la liste attendue ?

Quelques indices :