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–

Documents pareils