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
list
ne permet pas une performance algorithmique optimale. La structure de données la plus appropriée à ce type de problème est le dictionnairedict
que 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.