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 :

Test de comparaison de 2 fichiers


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut Test de comparaison de 2 fichiers
    Bonjour

    J'ai deux fichiers constituer de 5 collones à la structure identique et je veux les comparer.

    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
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    # coding: utf-8  
    import datetime
    import csv
    class Trixecel(object):
        rang = 0 
        def __init__(self):
            self.rang += 1 
            self.Code_a = None
            self.Code_b = None
            self.Code_C = None
            self.DATE_DEBUT_A = None
            self.DATE_FIN_A = None
            self.CODE_M = None
            self.DATE_DEBUT_C = None
            self.DATE_FIN_C = None
            pass
     
        def charger(self,Code_a,Code_b,Code_C,
                     DATE_DEBUT_A,DATE_FIN_A,
                     CODE_M,DATE_DEBUT_C,DATE_FIN_C):
            self.rang += 1 
            self.Code_a = Code_a
            self.Code_b = Code_b
            self.Code_C = Code_C
            self.DATE_DEBUT_A = DATE_DEBUT_A
            self.DATE_FIN_A = DATE_FIN_A
            self.CODE_M = CODE_M
            self.DATE_DEBUT_C = DATE_DEBUT_C
            self.DATE_FIN_C = DATE_FIN_C
            pass
     
     
        def __str__(self):
            resulta = "Code_a :" + str(self.Code_a ) +"\n"
            resulta += "Code_b :" + str(self.Code_b ) +"\n"
            resulta += "Code_C :" + str(self.Code_C ) +"\n"
            resulta += "DATE_DEBUT_A :" + str(self.DATE_DEBUT_A ) +"\n"
            resulta += "DATE_FIN_A :" + str(self.DATE_FIN_A ) +"\n"
            resulta += "CODE_M :" + str(self.CODE_M ) +"\n"
            resulta += "DATE_DEBUT_C :" + str(self.DATE_DEBUT_C ) +"\n"
            resulta += "DATE_FIN_C :" + str(self.DATE_FIN_C ) +"\n"
     
            return resulta
        pass
     
        def csv_donnee(self):
            return [self.Code_a,self.Code_b,self.Code_C,
                    self.DATE_DEBUT_A,self.DATE_FIN_A,
                    self.CODE_M,  self.DATE_DEBUT_C, self.DATE_FIN_C]
        pass
     
        def csv_entete(self):
            return ["Code_a","Code_b","Code_C",
                    "DATE_DEBUT_A","DATE_FIN_A",
                    "CODE_M","DATE_DEBUT_C","DATE_FIN_C"]
        pass
     
        def TstProd(self,un_Trixecel):
            if(
                (self.Code_a == un_Trixecel.Code_a) and
                (self.Code_b == un_Trixecel.Code_b) and
                (self.Code_C == un_Trixecel.Code_C) and
                (self.DATE_DEBUT_A == un_Trixecel.DATE_DEBUT_A) and
                (self.DATE_FIN_A == un_Trixecel.DATE_FIN_A) and
                (self.CODE_M == un_Trixecel.CODE_M) and
                (self.DATE_DEBUT_C == un_Trixecel.DATE_DEBUT_C) and
                (self.DATE_FIN_C == un_Trixecel.DATE_FIN_C)):
                return True
            else: 
                return False
     
        def Compare_ret(self,un_Trixecel):
            resulta = "Code_a:" + self.Code_a+" | " + un_Trixecel.Code_a + "\n"
            resulta += "Code_b:" + self.Code_b+" | " + un_Trixecel.Code_b + "\n"
            resulta += "Code_C:" + self.Code_C+" | " + un_Trixecel.Code_C + "\n"
            resulta += "DATE_DEBUT_A:" + self.DATE_DEBUT_A+" | " + un_Trixecel.DATE_DEBUT_A + "\n"
            resulta += "DATE_FIN_A:" + self.DATE_FIN_A+" | " + un_Trixecel.DATE_FIN_A + "\n"
            resulta += "CODE_M:" + self.CODE_M+" | " + un_Trixecel.CODE_M + "\n"
            resulta += "DATE_DEBUT_C:" + self.DATE_DEBUT_C+" | " + un_Trixecel.DATE_DEBUT_C + "\n"
            resulta += "DATE_FIN_C:" + self.DATE_FIN_C+" | " + un_Trixecel.DATE_FIN_C + "\n"
            return resulta
     
    pass
     
     
     
    def tronque_date(src):
        date_format = '%Y/%m/%d'
        valid_date = datetime.datetime.strptime(src, date_format)
        return valid_date
        pass
     
     
    class Les_Base_Trx(object):
        def __init__(self):
            self.Des_Base_Trx= list()
     
        def __str__(self):
            listeBase_Trx =""
            for un_Base_Trx in self.Des_Base_Trx:
                if(listeBase_Trx=="" ):
                    listeBase_Trx= str(un_Base_Trx)
                else:
                    listeBase_Trx+= "\n\n" + str(un_Base_Trx)  
            return    listeBase_Trx     
     
        def ajouter(self, Base_Trx): 
            """ Ajouter de l'objet issus du csv"""
            self.Des_Base_Trx.append(Base_Trx) 
     
        def detruire(self, Base_Trx): 
            """ Ajouter de l'objet issus du csv"""
            self.Des_Base_Trx.remove(Base_Trx) 
     
     
        def charger(self,nomfichier):
            nb_ligne =0
            ligne_csv = Trixecel()
            with open(nomfichier, 'r', newline='')   as fichier: 
                lire_fichier = csv.reader(fichier, delimiter = ';') # Codage du fichier csv d�limiter de champ
                for ligne in lire_fichier:
                    if(nb_ligne!=0):
                        ligne_csv.charger(*ligne)
                        ligne_csv.rang = nb_ligne
                        self.ajouter(ligne_csv)
                    nb_ligne+=1
     
     
    class Verif_Base_Trx(Trixecel):
        def __init__(self):
            self.check= False
            self.check_DATE_DEBUT_C = False
            self.check_DATE_FIN_C = False
     
        def __str__(self):
            resulta = "Code_a :" + str(self.Code_a ) +"\n"
            resulta += "Code_b :" + str(self.Code_b ) +"\n"
            resulta += "Code_C :" + str(self.Code_C ) +"\n"
            resulta += "DATE_DEBUT_A :" + str(self.DATE_DEBUT_A ) +"\n"
            resulta += "DATE_FIN_A :" + str(self.DATE_FIN_A ) +"\n"
            resulta += "CODE_M :" + str(self.CODE_M ) +"\n"
            resulta += "DATE_DEBUT_C :" + str(self.DATE_DEBUT_C ) +"\n"
            resulta += "DATE_FIN_C :" + str(self.DATE_FIN_C ) +"\n"
            resulta += "Test d'intégrité" + str(self.check)
            resulta += "Test d'intégrité DATE_DEBUT_C" + str(self.check_DATE_DEBUT_C)
            resulta += "Test d'intégrité DATE_FIN_C" + str(self.check_DATE_DEBUT_C)
            return resulta
     
     
     
        def __csv_donnee__(self):
            return [self.Code_a,self.Code_b,self.Code_C,
                    self.DATE_DEBUT_A,self.DATE_FIN_A,
                    self.CODE_M,  self.DATE_DEBUT_C, self.DATE_FIN_C,
                    self.check,self.check_DATE_DEBUT_C,self.check_DATE_DEBUT_C]
        pass
     
        def __csv_entete__(self):
            return ["Code_a","Code_b","Code_C",
                    "DATE_DEBUT_A","DATE_FIN_A",
                    "CODE_M","DATE_DEBUT_C","DATE_FIN_C",
                    "Test d'intégrité","Test d'intégrité DATE_DEBUT_C","Test d'intégrité DATE_FIN_C"]
     
        def csv_donnee(self, nomfichier):
            """  Ecriture du fichier format csv -donnee"""
            ecrire_csv = csv.writer(nomfichier, delimiter = ';') # Codage du fichier csv délimiter de champ
            ecrire_csv.writerow(self.__csv_donnee__())  # donnée  
     
        def csv_entete(self,nomfichier):
            """  Ecriture du fichier format csv -entete"""
            ecrire_csv = csv.writer(nomfichier, delimiter = ';') # Codage du fichier csv délimiter de champ
            ecrire_csv.writerow(self.__csv_entete__())  # donnée 
     
        pass 
     
     
     
        pass



    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
    # coding: utf-8  
    import string
    import sys
    import datetime
    import csv
    import os
     
    from Base.Explorateur import *
    from Base.Trixel import *
    '''
    Created on 1 nov. 2017 
     
    @author:  dedalios
    '''
     
    un_Les_Base_Trx = Les_Base_Trx()
    deux_Les_Base_Trx = Les_Base_Trx()
    res_Les_Base_Trx =  Verif_Base_Trx()
     
    if __name__ == '__main__':
        # fichier N°1
        nom_fichier_path_in = explorateur_window (".//") # Recherche via explorateur
        if os.path.isfile(nom_fichier_path_in):
            nom_fichier_in = os.path.basename(nom_fichier_path_in) # Retourne le nom du fichier
            nom_fichier_path = os.path.dirname(nom_fichier_path_in) # Retourne le répertoire complet
            list_nf = os.path.split(nom_fichier_path_in) # Fractionne le chemin d'acc�s. Retourne un tuple
            nb_ligne =0
            # Méthode N°1 tous le fichier
            with open(nom_fichier_path_in, 'r', newline='')   as fichier:  
                un_Les_Base_Trx.charger(nom_fichier_path_in)
        # fichier N°2       
        nom_fichier_path_in = explorateur_window (".//") # Recherche via explorateur
        if os.path.isfile(nom_fichier_path_in):
            nom_fichier_in = os.path.basename(nom_fichier_path_in) # Retourne le nom du fichier
            nom_fichier_path = os.path.dirname(nom_fichier_path_in) # Retourne le répertoire complet
            list_nf = os.path.split(nom_fichier_path_in) # Fractionne le chemin d'acc�s. Retourne un tuple
            nb_ligne =0
            # Méthode N°1 tous le fichier
            with open(nom_fichier_path_in, 'r', newline='')   as fichier:  
                deux_Les_Base_Trx.charger(nom_fichier_path_in)
        # analyse coparative  
     
        nom_fichier_out = nom_fichier_path +'//'+'Check.' + nom_fichier_in.strip() +".csv" 
        fichier_out = open(nom_fichier_out, 'w', newline='')    
        res_Les_Base_Trx.csv_entete(fichier_out) 
     
        for obj1  in un_Les_Base_Trx.Des_Base_Trx:
                for  obj2 in  deux_Les_Base_Trx.Des_Base_Trx:
                    result = obj1.TstProd(obj2) 
                    res_Les_Base_Trx.charger(obj1.Code_a, obj1.Code_b, obj1.Code_C, obj1.DATE_DEBUT_A, 
                                             obj1.DATE_FIN_A, obj1.CODE_M, obj1.DATE_DEBUT_C, obj1.DATE_FIN_C)
                    res_Les_Base_Trx.check = result
                    res_Les_Base_Trx.csv_donnee(fichier_out) 
     
     
        try: 
            print("")
        finally:  
            print("")    
        pass

    ce code pose problème car meme s'il va à la fiin le fichier généré est le produit des 2 fichiers.


    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
     
     
     
    # coding: utf-8  
    import string
    import sys
    import datetime
    import csv
    import os
     
    from Base.Explorateur import *
    from Base.Trixel import *
    '''
    Created on 1 nov. 2017 
     
    @author:  dedalios
    '''
     
    un_Les_Base_Trx = Les_Base_Trx()
    deux_Les_Base_Trx = Les_Base_Trx()
    res_Les_Base_Trx =  Verif_Base_Trx()
     
    if __name__ == '__main__':
        # fichier N°1
        nom_fichier_path_in = explorateur_window (".//") # Recherche via explorateur
        if os.path.isfile(nom_fichier_path_in):
            nom_fichier_in = os.path.basename(nom_fichier_path_in) # Retourne le nom du fichier
            nom_fichier_path = os.path.dirname(nom_fichier_path_in) # Retourne le répertoire complet
            list_nf = os.path.split(nom_fichier_path_in) # Fractionne le chemin d'acc�s. Retourne un tuple
            nb_ligne =0
            # Méthode N°1 tous le fichier
            with open(nom_fichier_path_in, 'r', newline='')   as fichier:  
                un_Les_Base_Trx.charger(nom_fichier_path_in)
        # fichier N°2       
        nom_fichier_path_in = explorateur_window (".//") # Recherche via explorateur
        if os.path.isfile(nom_fichier_path_in):
            nom_fichier_in = os.path.basename(nom_fichier_path_in) # Retourne le nom du fichier
            nom_fichier_path = os.path.dirname(nom_fichier_path_in) # Retourne le répertoire complet
            list_nf = os.path.split(nom_fichier_path_in) # Fractionne le chemin d'acc�s. Retourne un tuple
            nb_ligne =0
            # Méthode N°1 tous le fichier
            with open(nom_fichier_path_in, 'r', newline='')   as fichier:  
                deux_Les_Base_Trx.charger(nom_fichier_path_in)
        # analyse coparative  
     
        nom_fichier_out = nom_fichier_path +'//'+'Check.' + nom_fichier_in.strip() +".csv" 
        fichier_out = open(nom_fichier_out, 'w', newline='')    
        res_Les_Base_Trx.csv_entete(fichier_out) 
     
     
        for obj1,obj2  in un_Les_Base_Trx.Des_Base_Trx, deux_Les_Base_Trx.Des_Base_Trx:
            result = obj1.TstProd(obj2) 
            print(result)
            res_Les_Base_Trx.charger(obj1.Code_a, obj1.Code_b, obj1.Code_C, obj1.DATE_DEBUT_A, 
                                             obj1.DATE_FIN_A, obj1.CODE_M, obj1.DATE_DEBUT_C, obj1.DATE_FIN_C)
            res_Les_Base_Trx.check = result
            res_Les_Base_Trx.csv_donnee(fichier_out) 
     
     
     
     
     
        try: 
            print("")
        finally:  
            print("")    
        pass
    Celui-ci retourne ce message

    Traceback (most recent call last):
    File "C:\Users\moimeme\eclice\Rece2\Base\lirecsv2.py", line 56, in <module>
    for obj1,obj2 in un_Les_Base_Trx.Des_Base_Trx, deux_Les_Base_Trx.Des_Base_Trx:
    ValueError: too many values to unpack (expected 2)



    J'ai souhaité utiliser la fonction detruire de la class Trixecel

    mais erreur de conception ou d'utilisation (je n'arrive pas à l'utiliser)


    def detruire(self, Base_Trx):
    """ Ajouter de l'objet issus du csv"""
    self.Des_Base_Trx.remove(Base_Trx)

    elle pourrrait me permettre si le test effectué par def TstProd(self,un_Trixecel) de la class Trixecel
    de supprimer obj2 lu et valide pour ne plus avoir à faire le test dans la boucle suivante de lecture de l'objet deux_Les_Base_Trx.
    Cela réduirait l'opération


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       for obj1  in un_Les_Base_Trx.Des_Base_Trx:
                for  obj2 in  deux_Les_Base_Trx.Des_Base_Trx:
                    result = obj1.TstProd(obj2) 
                    res_Les_Base_Trx.charger(obj1.Code_a, obj1.Code_b, obj1.Code_C, obj1.DATE_DEBUT_A, 
                                             obj1.DATE_FIN_A, obj1.CODE_M, obj1.DATE_DEBUT_C, obj1.DATE_FIN_C)
                    res_Les_Base_Trx.check = result
                    res_Les_Base_Trx.csv_donnee(fichier_out)

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Salut,

    C'est bien joli de fournir tour ces détails mais concernant:

    Citation Envoyé par dedalios Voir le message
    Celui-ci retourne ce message

    Traceback (most recent call last):
    File "C:\Users\moimeme\eclice\Rece2\Base\lirecsv2.py", line 56, in <module>
    for obj1,obj2 in un_Les_Base_Trx.Des_Base_Trx, deux_Les_Base_Trx.Des_Base_Trx:
    ValueError: too many values to unpack (expected 2)
    la question pourrait peut être se résumer à "à partir de deux listes A et B, comment construire une boucle for a, b .... où a, b seront n-ième élément de chaque liste". Et si on pense qu'il est difficile de se
    faire comprendre en français, on peut:


    Vous voyez inutile de raconter votre vie pour illustrer un point de détail de votre code.
    En plus, n'oubliez pas que l'intérêt d'un forum est de permettre à ce qui "lisent" d'éventuellement apprendre quelque chose sur Python. Donc décrire le problème plus succinctement (et en faisant un peu abstraction du code que vous êtes en train de réaliser), c'est mieux (y compris pour vous permettre de mieux cerner le problème et y trouver une solution tout seul).

    La solution s'appelle zip (c'est un builtins que vous gagneriez à connaître).

    Citation Envoyé par dedalios Voir le message
    J'ai souhaité utiliser la fonction detruire de la class Trixecel
    mais erreur de conception ou d'utilisation (je n'arrive pas à l'utiliser)
    Le défaut de conception est peut être de ne pas construire à partir de (Code_a,Code_b,Code_C) une clef qui permettrait d'utiliser un dictionnaire et utiliser une fonction de hash plutôt que de tout comparer à tout (ce qui est long).

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

  3. #3
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    comparaison table a
    rang Code_C DATE_DEBUT_A DATE_FIN_A CODE_M DATE_DEBUT_C
    1 a1 b1 c1 01/01/2000 &nbsp; x1 01/01/2005
    2 a2 b2 c2 01/01/2000 31/12/2001 x2 01/05/2005 01/02/2007
    3 a2 b2 c3 01/01/2002 31/12/2003 x2 01/05/2005 01/02/2007
    4 a2 b2 c3 01/01/2004 x2 01/05/2005 01/05/2007
    5 a5 b4 c7 01/01/2010 31/12/2010 x3 02/05/2007


    comparaison table b

    Code_a Code_b Code_C DATE_DEBUT_A DATE_FIN_A CODE_M DATE_DEBUT_C DATE_FIN_C
    1 a1 b1 c1 01/01/2000 x1 01/01/2005
    2 a2 b2 c2 01/01/2000 31/12/2001 x2 01/05/2005 01/02/2007
    a2 b2 c3 01/01/2004 x2 01/05/2005 01/05/2007
    5 a5 b4 c7 01/01/2010 x3 02/05/2007

    voici un exemple de ce qui doit être comparé.
    une des pistes de solution proposée sous pyhon


    La solution de wiztricks d'utiliser le builtins ZIP est effectivement une piste malheureusement dans ce cas de figure ce produit souffre d'une limitation les deux "list" a comparait n'ont pas le même nombre d'élément hors ZIP se base sur le fait suivant, l'analyse se limite au nombre d'enregistrement de la plus petite des 2 listes.


    je vais donc me penser sur utilisation une fonction de hash pour optimiser la comparaison - surtout au vu des volumes de données concernées.

Discussions similaires

  1. [Python 2.X] Comparaison de données dans des dossiers/sous-dossiers - test unitaires
    Par Kevin_Mylano dans le forum Calcul scientifique
    Réponses: 4
    Dernier message: 27/07/2016, 15h49
  2. Tests unitaires & base de données
    Par lalystar dans le forum Test
    Réponses: 15
    Dernier message: 18/06/2010, 16h50
  3. Comparaison de données entre deux arrays
    Par sironimo dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 20/04/2006, 17h44
  4. Comparaison des données de deux schéma de mêmes structure
    Par Moez Sokrati dans le forum Oracle
    Réponses: 1
    Dernier message: 28/03/2006, 18h24
  5. Test de comparaison
    Par Crazy_Gun dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 09/12/2005, 19h06

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