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

Outils pour utilisateurs

Outils du site


comparefichiers

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
comparefichiers [2009/03/16 15:51]
tyrtamos
comparefichiers [2010/04/11 07:39]
tyrtamos
Ligne 4: Ligne 4:
  
 Dire si 2 fichiers ont le même contenu, sans tenir compte des dates ni des autres propriétés (à part la longueur, bien entendu). Dire si 2 fichiers ont le même contenu, sans tenir compte des dates ni des autres propriétés (à part la longueur, bien entendu).
 +
 +===== Solution proposée =====
 +
 +Faire une lecture binaire du contenu des 2 fichiers pour les comparer.
 +
 +Cette lecture/comparaison est progressive, et permet de s'arrêter au 1er écart trouvé.
 +
 +Il faut, bien sûr, gérer toutes les erreurs possibles: fichier n'existe pas, ou erreur d'ouverture, de lecture ou de fermeture.
  
 ===== Code proposé ===== ===== Code proposé =====
Ligne 13: Ligne 21:
 import os import os
  
-def compfichiers(nf1nf2, lgbuf=32*1024):+def compfichiers(nfc1nfc2, lgbuf=32*1024):
     """Compare les 2 fichiers et renvoie True seulement s'ils ont un contenu identique"""     """Compare les 2 fichiers et renvoie True seulement s'ils ont un contenu identique"""
     f1 = f2 = None     f1 = f2 = None
 +    result = False
     try:     try:
-        result = False +        if os.path.getsize(nfc1== os.path.getsize(nfc2): 
-        # si leur longueur est différente, renvoie False +            f1 = open(nfc1, "rb"
-        if os.path.getsize(nf1)!=os.path.getsize(nf2): +            f2 = open(nfc2, "rb"
-            return result +            while True: 
-        # compare les contenus +                buf1 = f1.read(lgbuf) 
-        f1 = open(nf1, "rb"+                if len(buf1) == 0: 
-        f2 = open(nf2, "rb"+                    result = True 
-        while True: +                    break 
-            buf1 = f1.read(lgbuf) +                buf2 = f2.read(lgbuf) 
-            if len(buf1)==0: +                if buf1 != buf2: 
-                result = True +                    break
-                break +
-            buf2 = f2.read(lgbuf) +
-            if buf1!=buf2: +
-                break +
-        f1.close() +
-        f2.close() +
-    except: +
-        if f1!=None:+
             f1.close()             f1.close()
-        if f2!=None: 
             f2.close()             f2.close()
 +    except:
 +        if f1 != None: f1.close()
 +        if f2 != None: f2.close()
         raise IOError         raise IOError
     return result     return result
Ligne 44: Ligne 47:
  
 \\ \\
-Les 2 arguments nf1 et nf2 doivent être des noms de fichiers complets avec leur chemin.+Les 2 arguments nfc1 et nfc2 doivent être des **n**oms de **f**ichiers **c**omplets avec leur chemin.
  
 Je n'ai pas essayé, mais a priori, le code devrait être multi-plateforme. Je n'ai pas essayé, mais a priori, le code devrait être multi-plateforme.
Ligne 54: Ligne 57:
     * False s'ils ne le sont pas     * False s'ils ne le sont pas
  
-    * Une exception si une erreur est intervenue (ouverture, lecture, fermeture)+    * Une exception si une erreur est intervenue (fichier inconnu, erreur d'ouverture, de lecture, de fermeture)
  
 +\\
 Voilà comment on y fait appel dans ces 3 cas: Voilà comment on y fait appel dans ces 3 cas:
  
comparefichiers.txt · Dernière modification: 2010/04/11 07:39 de tyrtamos