Exploitation de données : les communes de France
Transcription
Exploitation de données : les communes de France
TP no 7 ISBS B1-ST01 2016-2017 Exploitation de données : les communes de France Le fichier texte des communes de France http://perso.esiee.fr/~georgesj/esiee/b1st01/communes.txt est adapté d’un classeur Excel (source INSEE) et contient pour chaque commune de France son indicatif de département, son nom et sa population au 1er janvier 2010. Enregistrez le fichier communes.txt dans votre répertoire de travail (vous pouvez le visualiser avec un éditeur). Créez un fichier programme Python vide communes.py et insérez-y progressivement les instructions fournies ou demandées. Pour lire le contenu du fichier et le stocker dans une variable chaîne de caractères, utilisez la syntaxe suivante : # communes.py # 09/12/2015 JCG pour ISBS nom_fichier = "communes.txt" 1 fic = open 2 (nom_fichier, encoding 3 ='utf8') texte = fic.read() 4 fic.close() 5 print(texte[ :100 6 ]) 7 Vous devriez obtenir ceci : #nom;département;population L'Abergement-Clémenciat;01;818 L'Abergement-de-Varey;01;201 Ambérieu-en- Vous constatez que chaque ligne du texte contient les données d’une commune séparées par des point-virgules, selon le schéma suivant : Ambérieu-en-Bugey;01;13131 À partir de la chaîne texte , créez la liste des lignes du fichier des communes que vous référencerez par le nom listeCommunes . Aide : pour créer la liste des lignes d’un texte, on peut utiliser la méthode split de la classe str : texte = """ligne1 ligne2 ligne3""" texte.split('\n') donnera ['ligne1', 'ligne2', 'ligne3'] listeCommunes = texte.split('\n') print(listeCommunes[: :10000 8 ] Vous devriez obtenir : ['#nom;département;population', 'La Motte-de-Galaure;26;694', 'Blessonville;52;226', 'Mamers;72;5877'] 1. la chaîne contient le nom du fichier texte sur disque. Il faut mettre le chemin complet si ce fichier n’est pas dans le même répertoire que le programme que l’on écrit. 2. open tente d’accéder au fichier sur disque et retourne un objet permettant d’agir sur ce fichier 3. encoding spécifie le format des données du fichier(utf8, ascii, cp1252) 4. read charge sous forme de texte (str) l’intégralité du fichier disque 5. close libère les ressources utilisées pour accéder au fichier 6. surtout ne pas afficher l’intégralité du texte, mais par exemple les cent premiers caractères 7. ligne à enlever ou à commenter une fois vérifié la bonne lecture 8. on affiche une ligne sur 10000 –1/3– ISBS B1-ST01 TP no 7 2016-2017 Nettoyez la liste listeCommunes de manière à vous assurer que chaque élément est conforme. Aide : il se peut que des lignes du fichier n’aient pas la structure demandée (lignes vides, erreurs de saisie, commentaires). Supprimez les lignes vides, ou commentaires (commençant par # ) ou qui ne contiennent pas deux points-virgules. Dans une boucle inversée ( for i in range(len(listeCommunes)-1, -1, -1): ) si la ligne i est vide, commence par un # ou ne contient pas deux points-virgules, affichez-la et supprimez-la ( listeCommunes.pop(i) ). Vérifiez : à rendre for i in range(len(listeCommunes)-1, -1, -1): if (listeCommunes[i]=='' # si la ligne est vide # complétez : ou si la ligne commence par un '#' # complétez : ou si la ligne ne compte pas deux ';' ): print("Problème ligne", i, listeCommunes[i]) listeCommunes.pop(i) print(listeCommunes[: :10000]) print(listeCommunes[: :10000]) Il devrait y avoir quatre lignes problématiques et vous devriez obtenir : ["L'Abergement-Clémenciat;01;818", 'La Motte-Fanjas;26;175', 'Blumeray;52;98', 'Le Mans;72;148340'] Modifiez la liste listeCommunes pour que chaque élément de la liste soit un tuple (nom, population, département) , p. ex. pour Noisy-le-Grand : ('Noisy-le-Grand', 63005, '93') . à rendre Aide : vous pouvez utiliser une boucle for i in range(len(listeCommunes)): puis pour chaque ligne listeCommunes[i] , créer les références nom, dept ( str ) et hab ( int ) en découpant la ligne ( split ) selon ses ';' et affecter à listeCommunes[i] le tuple (nom, hab, dept) . N’en affichez pas l’intégralité, mais par exemple de 10 000 en 10 000. Avec print(listeCommunes[ : :10000]) Vous devriez obtenir : [("L'Abergement-Clémenciat", 818, '01'), ('La Motte-Fanjas', 175, '26'), ('Blumeray', 98, '52'), ('Le Mans', 148340, '72')] à rendre Écrivez les instructions permettant de répondre aux questions suivantes : - Combien y a-t-il de communes en France ? - Quelle commune a le nom le plus long ? le plus court ? Aide : Pour le nom le plus long, affectez une variable record à 0 et une variable num_record à -1 , puis faites une boucle parcourant la liste. Si la longueur du nom de la commune courante est supérieure au record , modifiez record et num_record . En fin de boucle, affichez listeCommunes[num_record] - Quelles communes ont une population de 0 habitant ? Aide : Même principe que ci-dessus, mais en démarrant avec une liste vide et chaque fois que la commune courante possède 0 habitant, l’ajouter ( append ) à la liste. - Quelle commune a une population de 1 habitant ? Comment appelle-t-on son habitant ? –2/3– ISBS B1-ST01 TP no 7 2016-2017 - Quelle est la première (dernière) commune par ordre alphabétique ? Aide : Même principe que pour le nom le plus long, mais en comparant les noms de communes par ordre alphabétique. Il sera nécessaire de normaliser les noms avant de les comparer. On peut également utiliser min et max avec un paramètre key= de la même manière que dans sort (voir TP 3) Cadeau : ## ## ## ## ## ## ## ## http://fr.wikipedia.org/wiki/Diacritiques_utilisés_en_français le texte normalisé ne doit contenir que les 26 lettres minuscules, 16 lettres avec signes diacritiques (à â ä ç é è ê ë î ï ô ö ù û ü ÿ), à remplacer par leur forme normalisée (a, c, e, i, o, u, y) 2 ligatures en minuscules (æ, œ), à remplacer par leur forme normalisée (ae, oe) l'apostrophe, le tiret sans espace avant et après, l'espace à remplacer par une chaine vide DICO_REMPLACEMENT = { 'à': 'a', 'â': 'a', 'ä': 'a', 'æ': 'ae', 'ç': 'c', 'é': 'e', 'è': 'e', 'ê': 'e', 'ë': 'e', 'î': 'i', 'ï': 'i', 'ô': 'o', 'ö': 'o', 'œ': 'oe', 'ù': 'u', 'û': 'u', 'ü': 'u', 'ÿ': 'y', ' ': '', '-': '', "'": '',} def normalise(nom): return ''.join(DICO_REMPLACEMENT.get(c, c) for c in nom.lower()) - Quel département a le moins (le plus) de communes ? Aide : Utilisez un dictionnaire d’associations dept: nb_de_communes , vide au départ. Pour chaque ligne de la liste, si le département est déjà dans le dictionnaire, ajouter 1, sinon créer une nouvelle entrée avec l’indicatif du département associé à 1. - Quel département est le moins (le plus) peuplé ? Aide : Inspirez-vous du programme précédent. - Quel est le nom de commune le plus fréquent ? Aide : Triez la liste par ordre alphabétique, puis parcourez-la en comptant le nombre de communes de même nom, et en maintenant un record de communes de même nom. –3/3–