Ci-dessous, les différences entre deux révisions de la page.
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/ | ||
+ | |||
+ | Il faut, bien sûr, gérer toutes les erreurs possibles: fichier n' | ||
===== Code proposé ===== | ===== Code proposé ===== | ||
Ligne 13: | Ligne 21: | ||
import os | import os | ||
- | def compfichiers(nf1, nf2, lgbuf=32*1024): | + | def compfichiers(nfc1, nfc2, lgbuf=32*1024): |
""" | """ | ||
f1 = f2 = None | f1 = f2 = None | ||
+ | result = False | ||
try: | try: | ||
- | | + | if os.path.getsize(nfc1) == os.path.getsize(nfc2): |
- | # si leur longueur est différente, | + | f1 = open(nfc1, " |
- | | + | f2 = open(nfc2, " |
- | | + | while True: |
- | # compare les contenus | + | buf1 = f1.read(lgbuf) |
- | | + | if len(buf1) == 0: |
- | f2 = open(nf2, " | + | 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 | + | Les 2 arguments |
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, |
+ | \\ | ||
Voilà comment on y fait appel dans ces 3 cas: | Voilà comment on y fait appel dans ces 3 cas: | ||