2009-07-02 16 views
24

Possibili duplicati:
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?vedere se due file hanno lo stesso contenuto in pitone

Qual è il modo più semplice per vedere se due file sono lo stesso contenuto-saggio in Python .

Una cosa che posso fare è md5 ogni file e confrontare. C'è un modo migliore?

+1

Questo è un duplicato di http://stackoverflow.com/questions/ 254350 – pufferfish

risposta

54

Sì, penso che l'hashing del file sarebbe il modo migliore se devi confrontare diversi file e memorizzare gli hash per un confronto successivo. Poiché l'hash può interferire, è possibile eseguire un confronto byte per byte a seconda del caso d'uso.

Generalmente il confronto byte per byte sarebbe sufficiente ed efficiente, che il modulo filecmp già fa + altre cose.

Vedere http://docs.python.org/library/filecmp.html ad es.

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

Velocità considerazione: Di solito, se solo due file devono essere confrontati, li hashing e confrontando loro sarebbe più lento, invece di semplice confronto byte per byte, se fatto in modo efficiente. per esempio. il codice sotto tenta di time hash vs byte per byte

Disclaimer: questo non è il miglior modo di cronometrare o di confrontare due algo. e c'è bisogno di miglioramenti ma dà un'idea approssimativa. Se pensi che dovrebbe essere migliorato, dimmi che lo cambierò.

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 

e l'uscita è

cmpHash 0.234999895096 
cmpByteByByte 0.0 
+10

Nessun motivo per fare un hash costoso quando funzionerà un semplice confronto byte per byte. +1 per filecmp –

+8

Se si dispone di molti file enormi, non c'è motivo di fare un costoso confronto byte per byte quando un semplice calcolo hash funzionerà. –

+0

sì d'accordo, a meno che non dobbiamo confrontare N file tra loro, può filecmp lavorare lì o essere più veloce di hash? –

3

non sono sicuro se si desidera trovare i file duplicati o semplicemente confrontare due file singoli. Se quest'ultimo, l'approccio sopra (filecmp) è migliore, se il primo, il seguente approccio è migliore.

Qui ci sono molte domande di rilevamento di file duplicati. Supponendo che non sono molto piccoli e che la performance è importante, è possibile

  • Confrontare le dimensioni dei file prima, scartando tutto ciò che non corrisponde
  • Se le dimensioni dei file partita, confrontano utilizzando il più grande hash è possibile gestire, hashing pezzi di file per evitare di leggere l'intero file di grandi

Ecco è una risposta con Python implementations (io preferisco quella di nosklo, BTW)

Problemi correlati