Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
comparefichiersrep [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


comparefichiersrep

Warning: Undefined array key -1 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/html.php on line 1458

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
comparefichiersrep [2010/04/11 11:56]
tyrtamos
comparefichiersrep [2010/04/11 12:54]
tyrtamos
Ligne 26: Ligne 26:
 ===== Code proposé ===== ===== Code proposé =====
  
 +Voilà le code proposé (il est auto-documenté).
 +
 +Seule particularité: pour tenir compte des noms de fichier avec caractères accentués des Windows français, le tri des noms de fichiers est fait en fonction de l'ordre de classement français du dictionnaire. J'ai utilisé ici une version simplifiée de: [[http://www-clips.imag.fr/geta/gilles.serasset/tri-du-francais.html]]. Si on veut revenir au tri classique (rang des caractères de l'unicode), il suffit de supprimer le 'comp' des instructions 'xxxx.sort(comp)'. Mais dans ce cas, les majuscules et les minuscules ne seront pas rangées à la suite pour une même lettre. On peut d'ailleurs facilement modifier la chaine alpha de la fonction comp() pour l'adapter à ce qu'on veut.
 +
 +\\
 <code python> <code python>
 #!/usr/bin/python #!/usr/bin/python
Ligne 116: Ligne 121:
     except:     except:
         raise  # redéclenche l'exception pour traitement par l'appelant         raise  # redéclenche l'exception pour traitement par l'appelant
-    entrees.sort(comp)  # tri les noms+    entrees.sort(comp)
     nfics = []     nfics = []
     for entree in entrees:     for entree in entrees:
Ligne 126: Ligne 131:
 ############################################################################## ##############################################################################
 def comparefics(rep1, rep2, selections=["*"], exclusions=[""]): def comparefics(rep1, rep2, selections=["*"], exclusions=[""]):
-    """Compare les contenus des fichiers de rep1 qui sont aussi dans rep2"""+    """ Compare les contenus des fichiers de rep1 qui sont aussi dans rep2 
 +        et renvoie: 
 +           => 0 = contenus identiques 
 +           => 1 = contenus différents 
 +           => 2 = échec de la comparaison (droit de lecture insuffisant p. ex.) 
 +           => 3 = le fichier sélectionné de rep1 est absent de rep2 
 +           => 4 = le fichier sélectioné de rep2 est absent de rep1 
 +        génère une exception si la lecture des répertoires échoue 
 +    """
     try:     try:
-        nfics = listefics(rep1, selections, exclusions)+        nf1 = listefics(rep1, selections, exclusions) 
 +        nf2 = listefics(rep2, selections, exclusions)
     except:     except:
         raise  # redéclenche l'exception pour traitement par l'appelant         raise  # redéclenche l'exception pour traitement par l'appelant
     R = []     R = []
-    for nf in nfics:+    for nf in nf1: 
 +        print nf
         nfc1 = os.path.join(rep1, nf)         nfc1 = os.path.join(rep1, nf)
-        nfc2 = os.path.join(rep2, nf) +        if nf in nf2: 
-        if os.path.exists(nfc2):+            nfc2 = os.path.join(rep2, nf)
             try:             try:
                 res = comparefic(nfc1, nfc2)                 res = comparefic(nfc1, nfc2)
                 if res:                 if res:
-                    R.append([nf, True])+                    R.append([nf, 0])
                 else:                 else:
-                    R.append([nf, False])+                    R.append([nf, 1])
             except:             except:
-                R.append([nf, None])+                R.append([nf, 2])
         else:         else:
-            R.append([nf, "absent"])+            R.append([nf, 3]) 
 +    for nf in nf2: 
 +        if nf not in nf1: 
 +            R.append([nf, 4]) 
 +    R.sort(comp, key=lambda v: v[0])
     return R     return R
 </code> </code>
  
-Et voilà comment on utilise (comparaison des contenus des fichiers .doc entre les 2 répertoires):+\\ 
 +Et voilà comment on utilise (comparaison des contenus des fichiers *.doc entre les 2 répertoires):
  
 <code python> <code python>
Ligne 155: Ligne 175:
 rep2 = r"C:\Users\tyrtamos\chemin2".decode('utf-8') rep2 = r"C:\Users\tyrtamos\chemin2".decode('utf-8')
  
 +msg = [u"identiques", u"différents", u"échec", u"absent du 2ème rép.", u"absent du 1er rép."]
 try: try:
-    R = comparefics(rep1, rep2, ["*.doc"])+    R = comparefics(rep1, rep2, [u"*.doc"])
     for nf, r in R:     for nf, r in R:
-        print nf, r+        print nf, msg[r]
 except: except:
     print u"erreur d'entrée-sortie"     print u"erreur d'entrée-sortie"
 </code> </code>
  
 +\\
 Ce qui affichera, par exemple: Ce qui affichera, par exemple:
  
 <code> <code>
-fichier1.doc True +fichier1.doc identiques 
-fichier2.doc True +fichier2.doc identiques 
-fichier3.doc None +fichier3.doc échec 
-fichier4.doc False +fichier4.doc différents 
-fichier5.doc absent+fichier5.doc absent du 2ème rép. 
 +fichier6.doc absent du 1er rép. 
 +</code> 
 + 
 +Dans cet affichage, les résultats sont triés par nom de fichier (tri alphabétique français). Si on veut un tri par code résultat, il suffit d'ajouter avant le print: 
 + 
 +<code python> 
 +R.sort(key=lambda v: v[1]) # tri selon r
 </code> </code>
  
comparefichiersrep.txt · Dernière modification: 2010/04/11 12:54 de tyrtamos