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

  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 775
    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 775
    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. 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