CSV Python et Tuple

CSV et Tuple

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,

je dois récupérer les données d’un fichier CSV qui contient des établissement scolaire France, en voici un extrait du csv :

numero_uai;appellation_officielle;denomination_principale;patronyme_uai;secteur_public_prive_libe;adresse_uai;lieu_dit_uai;boite_postale_uai;code_postal_uai;localite_acheminement_uai;libelle_commune;coordonnee_x;coordonnee_y;epsg;latitude;longitude;appariement;localisation;nature_uai;nature_uai_libe;etat_etablissement;etat_etablissement_libe;code_departement;code_region;code_academie;code_commune;libelle_departement;libelle_region;libelle_academie;position;secteur_prive_code_type_contrat;secteur_prive_libelle_type_contrat;code_ministere;libelle_ministere;date_ouverture
0010134R;Ecole maternelle Centre;ECOLE MATERNELLE PUBLIQUE;CENTRE;Public;55 rue du Mont Blanc;;;01220;DIVONNE LES BAINS;Divonne-les-Bains;941596.6;6588731.4;EPSG:2154;46.35523174398531;6.142799430682985;Parfaite;Numéro de rue;101;ECOLE MATERNELLE;1;OUVERT;01;84;10;01143;Ain;Auvergne-Rhône-Alpes;Lyon;46.355231744,6.14279943068;99;SANS OBJET;06;MINISTERE DE L'EDUCATION NATIONALE;1966-10-27
0260419P;Ecole primaire St Michel sur Savasse;ECOLE ELEMENTAIRE PUBLIQUE;;Public;;LE VILLAGE;;26750;ST MICHEL SUR SAVASSE;Saint-Michel-sur-Savasse;866656.6;6451729.4;EPSG:2154;45.14471414809119;5.1206803834576045;Correcte;Ville;151;ECOLE DE NIVEAU ELEMENTAIRE;1;OUVERT;26;84;08;26319;Drôme;Auvergne-Rhône-Alpes;Grenoble;45.1447141481,5.12068038346;99;SANS OBJET;06;MINISTERE DE L'EDUCATION NATIONALE;1966-11-16
0260631V;Ecole maternelle Montchorel;ECOLE MATERNELLE PUBLIQUE;MONTCHOREL;Public;Place Montchorel;;;26100;ROMANS SUR ISERE;Romans-sur-Isère;861275.3;6440412.0;EPSG:2154;45.04412711173123;5.048500204949255;Parfaite;Numéro de rue;101;ECOLE MATERNELLE;1;OUVERT;26;84;08;26281;Drôme;Auvergne-Rhône-Alpes;Grenoble;45.0441271117,5.04850020495;99;SANS OBJET;06;MINISTERE DE L'EDUCATION NATIONALE;1966-09-22
0260958A;Ecole maternelle;ECOLE MATERNELLE PUBLIQUE;GERMAINE CHESNEAU;Public;;LE VILLAGE;;26380;PEYRINS;Peyrins;861066.3;6445887.7;EPSG:2154;45.093462055474;5.0476499075845895;Correcte;Ville;101;ECOLE MATERNELLE;1;OUVERT;26;84;08;26231;Drôme;Auvergne-Rhône-Alpes;Grenoble;45.0934620555,5.04764990758;99;SANS OBJET;06;MINISTERE DE L'EDUCATION NATIONALE;1972-06-10
0260966J;Ecole élémentaire Jean Monin;ECOLE ELEMENTAIRE PUBLIQUE;JEAN MONIN;Public;Rue Emile Ollivier;;;26100;ROMANS SUR ISERE;Romans-sur-Isère;861730.9;6441758.3;EPSG:2154;45.056138357756836;5.054729458832825;Parfaite;Numéro de rue;151;ECOLE DE NIVEAU ELEMENTAIRE;1;OUVERT;26;84;08;26281;Drôme;Auvergne-Rhône-Alpes;Grenoble;45.0561383578,5.05472945883;99;SANS OBJET;06;MINISTERE DE L'EDUCATION NATIONALE;1972-06-10
0260970N;Ecole publique La Pierrotte;ECOLE ELEMENTAIRE PUBLIQUE;LA PIERROTTE;Public;Rue de Coalville;;;26100;ROMANS SUR ISERE;Romans-sur-Isère;862478.8;6441135.9;EPSG:2154;45.05036064539567;5.064020280024979;Parfaite;Numéro de rue;151;ECOLE DE NIVEAU ELEMENTAIRE;1;OUVERT;26;84;08;26281;Drôme;Auvergne-Rhône-Alpes;Grenoble;45.0503606454,5.06402028002;99;SANS OBJET;06;MINISTERE DE L'EDUCATION NATIONALE;1972-06-10
0261165A;Ecole maternelle;ECOLE MATERNELLE PUBLIQUE;;Public;Rue des Orangers;;;26750;GENISSIEUX;Génissieux;864072.1;6445009.5;EPSG:2154;45.084849246983964;5.085550485384166;Parfaite;Numéro de rue;101;ECOLE MATERNELLE;1;OUVERT;26;84;08;26139;Drôme;Auvergne-Rhône-Alpes;Grenoble;45.084849247,5.08555048538;99;SANS OBJET;06;MINISTERE DE L'EDUCATION NATIONALE;1982-09-01
0261524R;ECOLE MATERNELLE MICHELET;ECOLE MATERNELLE PUBLIQUE;MICHELET;Public;13 rue Honegger;;;26000;VALENCE;Valence;851510.5;6427658.0;EPSG:2154;44.93153939579681;4.920579941351144;Correcte;Numéro de rue;101;ECOLE MATERNELLE;1;OUVERT;26;84;08;26362;Drôme;Auvergne-Rhône-Alpes;Grenoble;44.9315393958,4.92057994135;99;SANS OBJET;06;MINISTERE DE L'EDUCATION NATIONALE;2016-09-01
0271123Z;Collège Léonard de Vinci;COLLEGE;LEONARD DE VINCI;Public;30 rue de Barrière;;;27950;ST MARCEL;Saint-Marcel;586486.6;6890511.7;EPSG:2154;49.10437041767335;1.4454494181555873;Parfaite;Numéro de rue;340;COLLEGE;1;OUVERT;27;28;21;27562;Eure;Normandie;Rouen;49.1043704177,1.44544941816;99;SANS OBJET;06;MINISTERE DE L'EDUCATION NATIONALE;1975-09-01
0311500M;Ecole primaire privée Saint-Stanislas;ECOLE PRIMAIRE PRIVEE;SAINT-STANISLAS;Privé;22 rue des Fleurs;;;31000;TOULOUSE;Toulouse;574521.2;6278464.3;EPSG:2154;43.594125773929214;1.4465096817555143;Parfaite;Numéro de rue;151;ECOLE DE NIVEAU ELEMENTAIRE;1;OUVERT;31;76;16;31555;Haute-Garonne;Occitanie;Toulouse;43.5941257739,1.44650968176;30;CONTRAT D'ASSOCIATION TOUTES CLASSES;06;MINISTERE DE L'EDUCATION NATIONALE;1971-03-10
0480032Z;Collège privé Saint Privat;COLLEGE PRIVE;SAINT-PRIVAT;Privé;5 rue des Ecoles;;;48000;MENDE;Mende;739807.9;6379700.6;EPSG:2154;44.515235050459914;3.500849618064782;Parfaite;Numéro de rue;340;COLLEGE;1;OUVERT;48;76;11;48095;Lozère;Occitanie;Montpellier;44.5152350505,3.50084961806;30;CONTRAT D'ASSOCIATION TOUTES CLASSES;06;MINISTERE DE L'EDUCATION NATIONALE;1967-04-05
0573772R;Ecole élémentaire spécialisée;ECOLE ELEM.SPECIALISEE PRIVEE;ECOLE ÉLÉMENTAIRE ECREADYS;Privé;11 rue des rossignols;;;57200;SARREGUEMINES;Sarreguemines;995397.7;6896464.1;EPSG:2154;49.09986619259634;7.046589611532727;Parfaite;Numéro de rue;162;ECOLE DE NIVEAU ELEMENTAIRE SPECIALISEE;1;OUVERT;57;44;12;57631;Moselle;Grand Est;Nancy-Metz;49.0998661926,7.04658961153;10;HORS CONTRAT;06;MINISTERE DE L'EDUCATION NATIONALE;2018-09-03
0594635T;Section d'enseignement général et professionnel adapté du Collège Maxence Van Der Meersch;SEGPA;CLG MAXENCE VAN DER MEERSCH;Public;Rue Mirabeau;MOUVAUX;60025;59588;BONDUES CEDEX;Mouvaux;708978.8;7067743.4;EPSG:2154;50.706384444670576;3.1268797884803785;Parfaite;Numéro de rue;390;SECTION ENSEIGNT GEN. ET PROF. ADAPTE;1;OUVERT;59;32;09;59421;Nord;Hauts-de-France;Lille;50.7063844447,3.12687978848;99;SANS OBJET;06;MINISTERE DE L'EDUCATION NATIONALE;1975-09-01
0861212A;Ecole primaire privée Saint Thomas d'Aquin;ECOLE PRIMAIRE PRIVEE;ST THOMAS D'AQUIN;Privé;;LE PARC;;86700;ROMAGNE;Romagne;492089.6;6578109.2;EPSG:2154;46.270867264738435;0.29975967157238165;Correcte;Rue;151;ECOLE DE NIVEAU ELEMENTAIRE;1;OUVERT;86;75;13;86211;Vienne;Nouvelle-Aquitaine;Poitiers;46.2708672647,0.299759671572;10;HORS CONTRAT;06;MINISTERE DE L'EDUCATION NATIONALE;1983-10-03

Voilà le code que j’ai commencé à faire, je suis coincé avec la fonction CompDepEtab qui est censé renvoyé la liste du nombre d’établissements privés et publics de chaque département, sous la forme d’une liste de tuples (numéro département, nombre d’établissements publics, nombre d’établissements privés). Si vous avez des idées je suis preneur.

from csv import reader
from collections import Counter

#Donne la liste des établissement d'une ville  
def ville(tab):
    s=input("Entrez un nom de ville: ")
    x=len(tab)
    for i in range (1,len(tab)+1):
        if s  in tab[i][9]:
            print("===============================================================")
            print(tab[i][1])
            print(tab[i][7]," ",tab[i][5])
            print(tab[i][8])
            print(tab[i][9])

#Donne le nombre d'établissement d'un département          
def CompDepEtab (tab):
    dep=1
    liste =[]
    for dep in range (1,96):
       # print("dep :",dep)
        for i in range (1,len(tab)+1):
            #print("i : ",i)
            if str(dep) in tab[i][22]:
                print("le même dep : ",dep," que i : ",tab[i][22])




#ouvre le ficher csv en mode lecture
with open('etab.csv', 'r', encoding='utf-8') as read_obj:
    # Lecture dui fichier CSV
    csv_reader = reader(read_obj, delimiter=";")
    # création des tuple
    liste = list(map(tuple, csv_reader))
    # Affichage des tuples
    print(liste)
print(liste[6][9])
print(liste[6][1])
print (len(liste))
#ville(liste)
CompDepEtab (liste)

Merci d’avance. Lesnox

Édité par lesnox

+0 -0

Salut,

Je pense que pour commencer tu devrais utiliser un DictReader du module csv plutôt qu’un simple reader, ça consommerait la première ligne (l’en-tête) et te permettrait de produire des dictionnaires à partir de tes lignes plutôt que des tuples, et ainsi avoir des noms plus clairs à tes champs que 9 ou 22.

Ensuite le problème de ton comptage c’est que tu vas chercher des départements en les générant à partir de nombres. Déjà ça risque de poser problème pour la Corse, mais ça coince aussi pour l’exemple que tu montres : tu vas chercher '6' dans tes lignes alors que tu as '06'. Tu résous ce problème avec un in mais c’est une mauvaise solution : '6' in '16' vaudra True aussi.

L’idéal serait d’utiliser un objet Counter du module collections, auquel tu donnerais tous les départements trouvés sur les différentes lignes, et lui s’occuperait de compter. Tu pourrais ensuite faire appel à la méthode most_common pour avoir les tuples que tu souhaites.

Auteur du sujet

J’ai aussi pensé au tuple nommé mais le soucis vient que lors de mon import j’écrase les tuples au fur et à mesure…

je mets le code ici :

from collections import namedtuple
import csv


Etab = namedtuple('ETAB' , 'UAI Appelation Denomination Patronyme Secteur Adresse Lieu_Dit Boite_postale Code_Postal Localite Libelle_commune coordonnee_x coordonnee_y epsg latitude longitude appariement localisation nature_uai nature_uai_libe etat_etablissement etat_etablissement_libe code_departement code_region code_academie code_commune libelle_departement libelle_region libelle_academie position secteur_prive_code_type_contrat secteur_prive_libelle_type_contrat code_ministere libelle_ministere date_ouverture')

f = open('etab.csv', 'r', encoding='utf-8')


with f:
    reader = csv.reader(f,delimiter=';')
    for etab in map(Etab._make, reader):
        print(etab)

Merci pour ma suggestions je serais bien plus alaise avec les dictionnaires mais on m’oblige à utiliser les tuples ou tuple nommée.

D’où ce début de solution et là question :(

#Donne le nombre d'établissement d'un département          
def CompDepEtab (tab):
    i=1
    while i != len(tab):
        print(Counter(tab[i][22]).most_common())
        i=i+1

Avec la méthode Counter de collections j’arrive à ceci :

Counter({'0': 1, '1': 1})
Counter({'2': 1, '6': 1})
Counter({'2': 1, '6': 1})
Counter({'2': 1, '6': 1})
Counter({'2': 1, '6': 1})
Counter({'2': 1, '6': 1})
Counter({'2': 1, '6': 1})
Counter({'2': 1, '6': 1})
Counter({'2': 1, '7': 1})
Counter({'3': 1, '1': 1})
Counter({'4': 1, '8': 1})
Counter({'5': 1, '7': 1})
Counter({'5': 1, '9': 1})
Counter({'8': 1, '6': 1})

Édité par lesnox

+0 -0

Ah d’accord, je pensais que la contrainte du tuple ne valait pour le retour de la fonction CompDepEtab, et que tu pouvais utiliser ce que tu veux comme intermédiaires. C’est dommage, tu perds en lisibilité.

Après tu pourrais effectivement construire un tuple nommé à partir de la ligne d’en-tête de ton CSV, puis convertir tes lignes comme ça.

Maintenant je ne suis pas sûr de saisir quel est ton problème, est-ce que tu as pu avancer sur le comptage des établissements par département ?

Auteur du sujet

J’ai un peux avancer en faite je n’arrive toujours pas à trouver les nombre de fois ou un département apparait dans le liste de tuple… Ensuite je m’attaquerais à avoir cela :

  • renvoyé la liste du nombre d’établissements privés et publics de chaque département, sous la forme d’une liste de tuples (numéro département, nombre d’établissements publics, nombre d’établissements privés)
+0 -0

Juste un truc, tu parles de « renvoyer » des données. Là, tu fais des print dans tes fonctions, qui donc affichent des trucs à l’écran, mais ne renvoient rien.

Édité par Gabbro

Il y a bien des façons de passer à l’acte. Se taire en est une. Attribué à Jean-Bertrand Pontalis

+0 -0
Auteur du sujet

Je fait des print dans un premier temps pour ensuite les stocker dans une liste. La fin est de générer une page HTML avec du code Javascrit.

Édité par lesnox

+0 -0

Cette réponse a aidé l’auteur du sujet

  • renvoyé la liste du nombre d’établissements privés et publics de chaque département, sous la forme d’une liste de tuples (numéro département, nombre d’établissements publics, nombre d’établissements privés)
lesnox

Ah quoi est-ce que tu as le droit ? Est-ce que tu peux utiliser un collections.Counter par exemple ?

Sinon il va te falloir faire ce travail manuellement. Si tu n’as toujours pas droit aux dictionnaires tu pourras utiliser une liste où chaque indice représentera un département. L’idée c’est d’initialiser un compteur à zéro pour chaque département, puis parcourir les lignes de ton fichier et incrémenter le compteur du département correspondant.
Une fois toutes les lignes parcourues, tous les départements auront été comptés et tu sauras donc combien il y avait d’établissements dans chaque département, information que tu pourras renvoyer.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte