Une archive zip est un moyen permettant l’archivage (utilisation d’un seul fichier pour stocker plusieurs fichiers) et la compression de données (diminution de l’espace occupé sur le support numérique) sans perte de qualité.
Le format zip est conçu de telle sorte qu’il n’est pas nécessaire de décompresser toute l’archive pour extraire un fichier.
Comme la position de chaque fichier, ainsi que son nombre d’octets et d’autres informations sont disponibles dans le répertoire central situé en fin de fichier, on peut également lire le contenu d’un fichier sans le décompresser, ce qui s’avère parfois nécessaire lorsqu’on manipule des données très volumineuses.
Pour cet exercice, vous devez utiliser en priorité le fichier squelette ex08-zip.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 :
On travaille ici avec des données publiques fournies par Météo France :
ex08-zip-data-meteofrance2014.zip contient les observations météorologiques en France pour l’année 2014 ;codebook décrit les variables utilisées ;ex08-zip-data-meteo-france-stations.csv fait le lien entre les codes des stations météo et leur localisation géographique.Le fichier ex08-zip-data-meteo-france-synop.2015110112.csv est un fichier texte (décompressé) qui a la même structure que les membres de l’archive. Il donne de précieuses informations sur l’organisation des données.
L’objectif est d’écrire une fonction extract_temp() :
AAAAMMJJ, et un code de station météo (parmi ceux disponibles dans la liste des stations météo) ;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).
Python dispose du module zipfile pour manipuler les archives zip. En particulier ce module définit une classe ZipFile permettant de :
ZipFile à partir de l’archive ex08-zip-data-meteofrance2014.zip. En langage objet, on construit une instance de ZipFile en passant le nom de l’archive concernée en argument du constructeur de la classe.ZipFile.namelist() permet de lister le contenu de l’archive.L’archive est un fichier binaire, et la lecture d’un de ses membres s’effectue donc en mode binaire avec la méthode read() qui retourne une séquence de bytes. Cette séquence de bytes est convertie en str avec la méthode bytes.decode().
La
listne permet pas une performance algorithmique optimale. La structure de données la plus appropriée à ce type de problème est le dictionnairedictque nous verrons dans un autre exercice.
Une fois la fonction opérationnelle pour quelques arguments, ET SEULEMENT DANS CE CAS, lancer les doctests dans un terminal.
$ python -m doctest ex08_zip.py -v
La totalité des doctests doivent réussir.