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 :

problème boucle FOR et/ou dictionnaire [Windows 7] [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti Avatar de FolDeDol
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2013
    Messages : 32
    Par défaut problème boucle FOR et/ou dictionnaire [Windows 7]
    Bonjour à toutes et à tous,

    Je rencontre depuis quelques jours un problème avec une boucle FOR, enfin je suppose...

    J'ai une fonction qui va lire des fichiers stockés dans un répertoire et inscrire différentes données (nom, taille du fichier, nom de la société...) dans un dictionnaire (dico).
    Selon le type de fichier, le "parsage" va s'effectuer soit sur les 2 premiers caractères soit sur les 11 premiers caractères. Une comparaison avec une dictionnaire (société) me permet de déterminer le nom de la société. Jusqu'ici le script fonctionne correctement.

    En revanche, lorsque j'essaye d'ajouter le type d'équipement dans le dictionnaire (dico), le type d'équipement s'inscrit correctement mais les données des sociétés débloquent complétement. Je me base sur la même méthode que précédemment, à savoir un dictionnaire (equipement) auquel je vais me référer pour déterminer l'équipement.

    J'arrive à obtenir dans le dictionnaire soit le nom de la société soit le type d'équipement mais jamais les 2 ensemble.

    J'ai l'impression que le problème vient de la boule FOR qui à un moment ne s'initialise plus... Bref, je bloque.

    Pouvez-vous m'éclairer à ce sujet.

    Je joins en fichier ZIP le jeu de données et le code source ci-dessous.

    Cordialement,

    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
     
    import os
    import sys
     
    chemin_destination = 'C:/Users/Berty/Desktop/Berty/P.Y.M/Erreurs Stats/Destination/'
    os.chdir(chemin_destination)
     
    def retraitement():
     
    # Création d'un dictionnaire pour recevoir le flux des données.
        dico = {}
     
     
    # Déclaration d'un dictionnaire permettant de relier la statistique au nom
    # de la société.
     
        societe = {"67" : "SOCIETE 1", "0K" : "SOCIETE 2", "6N" : "SOCIETE 3",\
        "6Q" : "SOCIETE 4", "6K" : "SOCIETE 5","66" : "SOCIETE 6", "70" : "SOCIETE 7",\
        "72" : "SOCIETE 8", "6M" : "SOCIETE 9","6U" : "SOCIETE 10", "6O" : "SOCIETE 11",\
        "6Z" : "SOCIETE 12", "6R" : "SOCIETE 13", "6L" : "SOCIETE 14", "6T" : "SOCIETE 15",\
        "6P" : "SOCIETE 16", "factures_06" : "SOCIETE 8","factures_10" : "SOCIETE 8",\
        "factures_07" : "SOCIETE 7", "factures_08" : "SOCIETE 7", "factures_09" : "SOCIETE 7",\
        "factures_04" : "SOCIETE 2", "factures_03" : "SOCIETE 2", "" : "INCONNU"}
     
    # Déclaration d'un dictionnaire permettant de relier la statistique 
    # à l'équipement.
        equipement = {"factures" : "EQUIP LOURD", "B4600" : "EQUIP SIMPLIF", \
        "BC430" : "EQUIP PORTATIF","BC680" : "EQUIP LEGER", "" : "EQUIP EMBARQUE"}
     
     
        for element, lectureexcel in enumerate (os.listdir(chemin_destination)) :
    # Détermination de la taille du fichier.
            taille = round(os.path.getsize(lectureexcel)/1024,3)   
    # 
            for cle, valeur in societe.items() :
                if "fa" in lectureexcel :
                    if cle in lectureexcel[0:11] :
                        dico[element] = lectureexcel, valeur, taille
                else:
                    if cle in lectureexcel[0:2] :
                        dico[element] = lectureexcel, valeur, taille
     
     
            for cleequip, valeurequip in equipement.items() : 
                if cleequip in lectureexcel :
                    dico[element] = lectureexcel, valeur, taille, valeurequip
     
        for cle, valeur in dico.items():
            print(cle, valeur)          
     
        return retraitement
    retraitement()
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Moi j'obtiens ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    (0, ('0K030100002B46000001C70260906.20130206_080008.27G', 'SOCIETE 12', 0.0, 'EQUIP SIMPLIF'))
    (1, ('0K030300002B46000001C700C3843.20130206_080011.24S', 'SOCIETE 12', 0.0, 'EQUIP SIMPLIF'))
    (2, ('6P0450B52.20121019_100018.2AI', 'SOCIETE 12', 1.0, 'EQUIP EMBARQUE'))
    (3, ('0K030200002B46000002590484611.20130206_080009.2A9', 'SOCIETE 12', 0.0, 'EQUIP SIMPLIF'))
    (4, ('6K0330G47.20121107_080133.2B6', 'SOCIETE 12', 1.0, 'EQUIP EMBARQUE'))
    (5, ('0K2057000DBC6800A4FE380127611.32N', 'SOCIETE 12', 0.0, 'EQUIP LEGER'))
    (6, ('0K080500002B46000003B606B2E53.20130206_080018.2AN', 'SOCIETE 12', 0.0, 'EQUIP SIMPLIF'))
    (7, ('0K080100002B46000002580830C35.20130206_080016.31A', 'SOCIETE 12', 0.0, 'EQUIP SIMPLIF'))
    (8, ('0K030600002B46000003BC03D1B05.20130206_080015.28N', 'SOCIETE 12', 0.0, 'EQUIP SIMPLIF'))
    (9, ('6K0330829.20130219_080255.32I', 'SOCIETE 12', 0.0, 'EQUIP EMBARQUE'))
    (10, ('0K030600002B46000003BC03B9951.20130206_080015.28M', 'SOCIETE 12', 0.0, 'EQUIP SIMPLIF'))
    (11, ('6K0123G53.20130205_080309.324', 'SOCIETE 12', 1.0, 'EQUIP EMBARQUE'))
    ......
    Ce qui correspond à ce que tu sembles attendre, non ?

  3. #3
    Membre averti Avatar de FolDeDol
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2013
    Messages : 32
    Par défaut
    Bonjour VinsS,

    J'obtiens bien cette sortie dans la console malheureusement le nom de la société n'est plus bon. Par exemple pour la deuxième ligne, je devrais trouver dans le dictionnaire SOCIETE 2 (0K --> 2 premiers caractères du fichier) et non SOCIETE 12. Pour la quatrième ligne "6P" (2 premiers caractères du fichier) je devrais obtenir SOCIETE 16. Ce problème de "société" se pose dans l'ensemble du dictionnaire, en revanche les types d'équipements sont quant à eux corrects.

    Si j'ôte dans le code source les lignes 44 à 46, le nom de la société s'inscrit correctement dans le dictionnaire.

    Je tourne en rond sur ce problème...

    Cordialement,

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Comme ça je vois mieux.


    Est-ce ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    0 ['0K030100002B46000001C70260906.20130206_080008.27G', 'SOCIETE 2', 0.0, 'EQUIP EMBARQUE']
    1 ['0K030300002B46000001C700C3843.20130206_080011.24S', 'SOCIETE 2', 0.0, 'EQUIP EMBARQUE']
    2 ['6P0450B52.20121019_100018.2AI', 'SOCIETE 16', 1.0, 'EQUIP EMBARQUE']
    3 ['0K030200002B46000002590484611.20130206_080009.2A9', 'SOCIETE 2', 0.0, 'EQUIP EMBARQUE']
    4 ['6K0330G47.20121107_080133.2B6', 'SOCIETE 5', 1.0, 'EQUIP EMBARQUE']
    5 ['0K2057000DBC6800A4FE380127611.32N', 'SOCIETE 2', 0.156, 'EQUIP EMBARQUE']
    6 ['0K080500002B46000003B606B2E53.20130206_080018.2AN', 'SOCIETE 2', 0.0, 'EQUIP EMBARQUE']
    7 ['0K080100002B46000002580830C35.20130206_080016.31A', 'SOCIETE 2', 0.0, 'EQUIP EMBARQUE']
    8 ['0K030600002B46000003BC03D1B05.20130206_080015.28N', 'SOCIETE 2', 0.0, 'EQUIP EMBARQUE']
    9 ['6K0330829.20130219_080255.32I', 'SOCIETE 5', 0.0, 'EQUIP EMBARQUE']
    10 ['0K030600002B46000003BC03B9951.20130206_080015.28M', 'SOCIETE 2', 0.0, 'EQUIP EMBARQUE']
    ...
    La dernière boucle for était effectivement en cause.

    J'ai modifié comme ceci:
    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
     
    def retraitement():
        def get_equipement(lst):
            for key, value in equipement.items() : 
                if key in lst[0] :
                    lst.append(value)
                    return
     
        dico = {}
        societe = {"67" : "SOCIETE 1", "0K" : "SOCIETE 2", "6N" : "SOCIETE 3",
        "6Q" : "SOCIETE 4", "6K" : "SOCIETE 5","66" : "SOCIETE 6", "70" : "SOCIETE 7",
        "72" : "SOCIETE 8", "6M" : "SOCIETE 9","6U" : "SOCIETE 10", "6O" : "SOCIETE 11",
        "6Z" : "SOCIETE 12", "6R" : "SOCIETE 13", "6L" : "SOCIETE 14", "6T" : "SOCIETE 15",
        "6P" : "SOCIETE 16", "factures_06" : "SOCIETE 8","factures_10" : "SOCIETE 8",
        "factures_07" : "SOCIETE 7", "factures_08" : "SOCIETE 7", "factures_09" : "SOCIETE 7",
        "factures_04" : "SOCIETE 2", "factures_03" : "SOCIETE 2", "" : "INCONNU"}
        equipement = {"factures" : "EQUIP LOURD", "B4600" : "EQUIP SIMPLIF", 
        "BC430" : "EQUIP PORTATIF","BC680" : "EQUIP LEGER", "" : "EQUIP EMBARQUE"}
     
        equip_keys = equipement.keys()
        for idx, filename in enumerate (os.listdir(chemin_destination)):
            taille = round(os.path.getsize(filename)/1024.0, 3)   
            for cle, valeur in societe.items() :
                if "fa" in filename :
                    if cle in filename[0:11] :
                        dico[idx] = [filename, valeur, taille]
                        get_equipement(dico[idx])
                        continue
     
                else:
                    if cle in filename[0:2] :
                        dico[idx] = [filename, valeur, taille]
                        get_equipement(dico[idx])
                        continue
     
        for cle, valeur in dico.items():
            print(cle, valeur)          
     
        return
    retraitement()

  5. #5
    Membre averti Avatar de FolDeDol
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2013
    Messages : 32
    Par défaut
    Merci beaucoup VinsS !

    Tout fonctionne correctement.
    Je comprends comment vous avez construit et agencé votre code. Débutant en Python, il me reste encore beaucoup à apprendre... mais alors beaucoup...

    Merci encore.

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

Discussions similaires

  1. Problème boucle for
    Par revsys dans le forum Delphi
    Réponses: 20
    Dernier message: 24/05/2007, 15h50
  2. Problème boucle for
    Par rouliane dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2006, 14h37
  3. [VBA-E, Débutant] Problème Boucle for
    Par strifer dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/08/2006, 12h30
  4. [Débutant] Problème boucle for
    Par toniooooo dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 14h42
  5. [FLASH 8] Problème Boucle For
    Par Begood dans le forum Flash
    Réponses: 6
    Dernier message: 21/03/2006, 11h36

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