IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Demande d'aide pour traitement de données [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de jpbontront
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2015
    Messages : 19
    Par défaut Demande d'aide pour traitement de données
    Bonjour à toutes et tous,

    Je viens vers vous pour m'aider à améliorer le code que j'ai écrit, car actuellement, c'est extrêmement long.
    Je suis développeur, mais très débutant en Python.

    Principe :
    A partir de deux fichiers .csv, je souhaite générer une fichier GEDCOM
    Le premier fichier contient des données de personnes, j'ai environ 35 fichiers, un par année qui ont chacun, environ 400 000 lignes.
    Le second fichier, est une fichier .csv, de correspondance entre un code ville INSEE et le détail pour ce code INSEE, ce fichier à environ 36 000 lignes.

    Exemple de fichier (Année 1971)
    Fichier 1:
    "nomprenom";"sexe";"datenaiss";"lieunaiss";"commnaiss";"paysnaiss";"datedeces";"lieudeces";"actedeces"
    "PACCARD*JEAN/";"1";"19001211";"01001";"L'ABERGEMENT-CLEMENCIAT";"";"19711021";"01093";"42"
    "PERRUCHET*JOANNY/";"1";"19050808";"01001";"L'ABERGEMENT-CLEMENCIAT";"";"19710310";"71270";"132"
    "RIGAUD*JEANNE MARIE/";"2";"19080805";"01001";"L'ABERGEMENT-CLEMENCIAT";"";"19710218";"01446";"1"
    "GUICHARD*ANTOINETTE/";"2";"19130426";"01001";"L'ABERGEMENT-CLEMENCIAT";"";"19710523";"01028";"3"
    "BOUCHY*JEAN CLAUDE/";"1";"18940930";"01001";"L'ABERGEMENT-CLEMENCIAT";"";"19710218";"69384";"92"
    "GAUTHIER*MICHEL/";"1";"18990922";"01001";"L'ABERGEMENT-CLEMENCIAT";"";"19710723";"01028";"5"
    Fichier 2
    insee;cPostam;Commune;dep;reg
    1001;1400;L'ABERGEMENT-CLEMENCIAT;AIN;RHONE-ALPES
    1002;1640;L'ABERGEMENT-DE-VAREY;AIN;RHONE-ALPES
    1004;1500;AMBERIEU-EN-BUGEY;AIN;RHONE-ALPES
    1005;1330;AMBERIEUX-EN-DOMBES;AIN;RHONE-ALPES
    1006;1300;AMBLEON;AIN;RHONE-ALPES
    1007;1500;AMBRONAY;AIN;RHONE-ALPES
    Le code Python que j'ai créé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    import os
     
    Nom = Prenom = Sexe = DateNaissance = DateDeces = VilleN = DepN = RegionN = VilleD = DepD = RegionD = ""
    mon_fichier = ""
     
    os.system("cls")
     
    def chercheVille(Code, Type):
        comm = open('commune.csv', "r")
        leCode = Code[1:len(Code)-1]
        # utilisez readline() pour lire la première ligne
        maComm = comm.readline()
        while maComm:
            laLigneComm = maComm.split(";")
            if (len(laLigneComm[0]) == 4):
                valActuelle = "0" + laLigneComm[0]
            else:
                valActuelle = laLigneComm[0]
            if(valActuelle == leCode):
                if(Type == "N"):
                    global VilleN, DepN, RegionN
                    VilleN = laLigneComm[2]
                    DepN = laLigneComm[3]
                    RegionN = laLigneComm[4]
                else:
                    global VilleD, DepD, RegionD
                    VilleD = laLigneComm[2]
                    DepD = laLigneComm[3]
                    RegionD = laLigneComm[4]             
            maComm = comm.readline()
        comm.close
     
    def analyseIdentite(Valeur):
        global Nom, Prenom
        Nom = Valeur[1:Valeur.find("*")]
        Prenom = Valeur[Valeur.find("*")+1:Valeur.find("/")]
     
    def analyseSexe(Valeur):
        global Sexe
        if ("1" in Valeur):
            Sexe = "M"
        else:
            Sexe = "F"
     
    def analyseDate(Valeur, Type):
        global DateNaissance, DateDeces
        annee = Valeur[1:5]
        mois = Valeur[5:7]
        if ("01" in mois):
            mois="JAN"
        elif ("02" in mois):
            mois="FEB"
        elif ("03" in mois):
            mois="MAR"
        elif ("04" in mois):
            mois="APR"
        elif ("05" in mois):
            mois="MAY"
        elif ("06" in mois):
            mois="JUN"
        elif ("07" in mois):
            mois="JUI"
        elif ("08" in mois):
            mois="AUG"
        elif ("09" in mois):
            mois="SEP"
        elif ("10" in mois):
            mois="OCT"
        elif ("11" in mois):
            mois="NOV"
        elif ("12" in mois):
            mois="DEC"
        jour = Valeur[7:9]
        if (Type == "N"):
            DateNaissance = jour + " " + mois + " " + annee
        else:
            DateDeces = jour + " " + mois + " " + annee
     
    # Ouvrir le fichier en lecture seule
    file = open('deces-1972.csv', "r")
    # utilisez readline() pour lire la première ligne
    line = file.readline()
    AncN = AncD = ""
     
    mon_fichier = open("import-1972.ged", "w")
    mon_fichier.write("0 HEAD\n")
    mon_fichier.write("1 DEST ANY\n")
    mon_fichier.write("1 CHAR UTF-8\n")
    mon_fichier.close
    i = 1
    while line:
        os.system("cls")
        print(i)
        if (line.find("*") >= 0):
            maLigne = line.split(";")
            analyseIdentite(maLigne[0])
            analyseSexe(maLigne[1])
            analyseDate(maLigne[2], "N")
            if (maLigne[3] != AncN):
                chercheVille(maLigne[3], "N")
                AncN = maLigne[3]
            analyseDate(maLigne[6], "D")
            if(maLigne[7] != AncD):
                chercheVille(maLigne[7], "D")
                AncD = maLigne[7]
     
            mon_fichier = open("import-1972.ged", "a")
            mon_fichier.write("0 @I%i@ INDI\n" % i)
            mon_fichier.write("1 NAME " + Prenom + "/" + Nom + "/\n")
            mon_fichier.write("1 SEX %s\n" % Sexe)
            mon_fichier.write("1 BIRT\n")
            mon_fichier.write("2 DATE %s\n" % DateNaissance)
            mon_fichier.write("2 PLAC " + VilleN + "," + DepN + "," + RegionN)
            mon_fichier.write("2 SOUR @S1@\n")
     
            mon_fichier.write("1 DEAT\n")
            mon_fichier.write("2 DATE %s\n" % DateDeces)
            mon_fichier.write("2 PLAC " + VilleD + "," + DepD + "," + RegionD)
            mon_fichier.write("2 SOUR @S1@\n")
            mon_fichier.write("0 @S1@ SOUR\n")
            mon_fichier.write("1 TITL Registre de l'INSEE\n")
            mon_fichier.close
            i = i + 1
        line = file.readline()
    file.close()
    mon_fichier = open("import-1972.ged", "a")
    mon_fichier.write("0 TRLR\n")
    mon_fichier.close
    Ceci fonctionne, mais, comme je le disais, c'est très long, pour l'analyse de 1 000 lignes du fichier 1, cela prend environ 35 secondes, soit plus de 2h30 par fichier de base, comme j'en ai environ 35, je vous laisse calculer.

    Si vous pouvez m'apporter votre aider pour améliorer mon code, ce serait formidable.

    Merci d'avance et au plaisir de vous lire.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 736
    Par défaut
    Salut,

    Je m'arrête à la fonction chercheVille: à chaque itération vous allez balayez le fichier commune.csv pour y rechercher Code passé en paramètre.

    Sachant que les accès disques sont 1000 fois plus lents que les accès mémoire, çà serait bien de ne lire le fichier qu'une seule fois au lancement du programme et de balayer la liste correspondante en mémoire ou mieux en faire un dictionnaire avec code comme clef.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti Avatar de jpbontront
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2015
    Messages : 19
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Je m'arrête à la fonction chercheVille: à chaque itération vous allez balayez le fichier commune.csv pour y rechercher Code passé en paramètre.

    Sachant que les accès disques sont 1000 fois plus lents que les accès mémoire, çà serait bien de ne lire le fichier qu'une seule fois au lancement du programme et de balayer la liste correspondante en mémoire ou mieux en faire un dictionnaire avec code comme clef.

    - W
    Bonjour wiztricks,

    Déjà, merci d’avoir pris le temps de me répondre.
    Je craignais cette réponse. 😀
    Je ne vous caches pas que j’ai cherché à créer un dico dans un fichier dico.py puis de l’importer, mais après, je m’y perd et ne m’en sors pas.

    Si vous aviez l’amabilité de me donner un exemple concret, je travaillerais sur cet axe.

    Mille mercis.
    Jp

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 736
    Par défaut
    Salut,

    Si vous ne maîtrisez pas les dictionnaires, utilisez une liste.

    Et si vous voulez utilisez un dictionnaire, ouvrez un tuto. apprenez à les utiliser... Sinon ben oui vous serez perdu, normal, c'est pas compliqué mais il faut y passer un peu de temps.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti Avatar de jpbontront
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2015
    Messages : 19
    Par défaut
    Merci,

    Je vais donc m'y plonger, car je n'ai commencé le Python qu'hier et j'ai normalement de manque.

    Je reviendrai plus tard, si j'ai besoin d'assistance.

    Encore merci

  6. #6
    Membre averti Avatar de jpbontront
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2015
    Messages : 19
    Par défaut
    Je viens de créer un dico, dans un fichier séparé, dico.py

    Résumé du fichier dico.py
    Lieu = [
    {"Code":"1001", "Ville":"L'ABERGEMENT-CLEMENCIAT", "Dep":"AIN", "Reg":"RHONE-ALPES", "Pays":"FRANCE"},
    {"Code":"1002", "Ville":"L'ABERGEMENT-DE-VAREY", "Dep":"AIN", "Reg":"RHONE-ALPES", "Pays":"FRANCE"},
    {"Code":"1004", "Ville":"AMBERIEU-EN-BUGEY", "Dep":"AIN", "Reg":"RHONE-ALPES", "Pays":"FRANCE"},
    {"Code":"1005", "Ville":"AMBERIEUX-EN-DOMBES", "Dep":"AIN", "Reg":"RHONE-ALPES", "Pays":"FRANCE"},
    ....
    ]
    Je fais mon import
    Comment faire pour rechercher une valeur dans la clé Code et récupérer les items correspondant pour le mettre dans une variable ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'aide pour traitement de données
    Par Karoutchi Killian dans le forum Windows
    Réponses: 0
    Dernier message: 07/10/2015, 01h09
  2. Réponses: 1
    Dernier message: 07/07/2015, 21h10
  3. Demande d'aide pour extraire des données Excel à l'aide python
    Par userinfo dans le forum Général Python
    Réponses: 5
    Dernier message: 05/01/2013, 11h45
  4. Demande d'aide pour un traitement en cartographie
    Par pham1980 dans le forum SIG : Système d'information Géographique
    Réponses: 6
    Dernier message: 17/06/2007, 18h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo