2009-07-02 9 views
24

Doublons possibles:
Finding duplicate files and removing them.
In Python, is there a concise way of comparing whether the contents of two text files are the same?voir si deux fichiers ont le même contenu en python

Quelle est la meilleure façon de voir si deux fichiers sont les mêmes sage contenu en Python .

Une chose que je peux faire est md5 chaque fichier et comparer. Y a-t-il un meilleur moyen?

+1

C'est un double de http://stackoverflow.com/questions/ 254350 – pufferfish

Répondre

54

Oui, je pense que le hachage du fichier serait le meilleur moyen si vous deviez comparer plusieurs fichiers et stocker des hachages pour une comparaison ultérieure. Comme le hachage peut se heurter, une comparaison octet par octet peut être effectuée en fonction du cas d'utilisation.

Généralement, la comparaison octet par octet serait suffisante et efficace, ce que fait déjà le module filecmp +.

Voir http://docs.python.org/library/filecmp.html par exemple.

>>> import filecmp 
>>> filecmp.cmp('file1.txt', 'file1.txt') 
True 
>>> filecmp.cmp('file1.txt', 'file2.txt') 
False 

considération de vitesse: Habituellement, si seulement deux fichiers doivent être comparés, les hachant et les comparant seraient plus lents au lieu de comparaison simple octet par octet si fait efficacement. par exemple. Le code ci-dessous essaie de chronométrer le hash par rapport à byte by byte

Avertissement: ce n'est pas la meilleure façon de chronométrer ou de comparer deux algo. et il y a besoin d'améliorations, mais cela donne une idée approximative. Si vous pensez qu'il devrait être amélioré dites-moi que je vais le changer.

import random 
import string 
import hashlib 
import time 

def getRandText(N): 
    return "".join([random.choice(string.printable) for i in xrange(N)]) 

N=1000000 
randText1 = getRandText(N) 
randText2 = getRandText(N) 

def cmpHash(text1, text2): 
    hash1 = hashlib.md5() 
    hash1.update(text1) 
    hash1 = hash1.hexdigest() 

    hash2 = hashlib.md5() 
    hash2.update(text2) 
    hash2 = hash2.hexdigest() 

    return hash1 == hash2 

def cmpByteByByte(text1, text2): 
    return text1 == text2 

for cmpFunc in (cmpHash, cmpByteByByte): 
    st = time.time() 
    for i in range(10): 
     cmpFunc(randText1, randText2) 
    print cmpFunc.func_name,time.time()-st 

et la sortie est

cmpHash 0.234999895096 
cmpByteByByte 0.0 
+10

Aucune raison de faire un hachage coûteux quand une simple comparaison byte by byte fonctionnera. +1 pour filecmp –

+8

Si vous avez beaucoup de gros fichiers, il n'y a aucune raison de faire une comparaison coûteuse par octet coûteuse quand un simple calcul de hash fonctionnera. –

+0

Oui d'accord, à moins que nous ayons à comparer N fichiers les uns avec les autres, peut-il travailler là-bas ou être plus rapide que hachage? –

3

Je ne suis pas sûr si vous voulez trouver les fichiers en double ou tout simplement comparer deux fichiers individuels. Si ce dernier, l'approche ci-dessus (filecmp) est meilleur, si le premier, l'approche suivante est meilleure.

Il y a beaucoup de questions de détection de fichiers en double ici. Si l'on suppose qu'ils ne sont pas très petites et que la performance est importante, vous pouvez

  • Comparer la taille des fichiers d'abord, jeter tout ce qui ne correspond pas à
  • Si la taille des fichiers match comparer en utilisant le plus grand hachage que vous pouvez gérer, hachant morceaux de fichiers pour éviter de lire tout le gros fichier

Voici est une réponse avec Python implementations (je préfère celui par nosklo, BTW)

Questions connexes