2009-07-02 17 views
24

posibles duplicados:
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?ver si dos archivos tienen el mismo contenido en Python

¿Cuál es la forma más fácil de ver si dos archivos son los mismos en cuanto al contenido en Python .

Una cosa que puedo hacer es md5 cada archivo y comparar. ¿Hay una mejor manera?

+1

Este es un duplicado de http://stackoverflow.com/questions/ 254350 – pufferfish

Respuesta

54

Sí, creo que el archivo de hash sería la mejor manera si tiene que comparar varios archivos y almacenar hash para una comparación posterior. Como el hash puede entrar en conflicto, se puede hacer una comparación byte a byte dependiendo del caso de uso.

En general, la comparación byte a byte sería suficiente y eficiente, que módulo filecmp ya hace + otras cosas también.

Ver http://docs.python.org/library/filecmp.html e.g.

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

velocidad consideración: Por lo general, si sólo hay dos archivos tienen que compararse, hash ellos y compararlos sería más lento en lugar de la simple comparación byte a byte si se hace de manera eficiente. p.ej. el siguiente código intenta calcular el tiempo hash vs byte a byte

Descargo de responsabilidad: esta no es la mejor manera de sincronizar o comparar dos algo. y hay necesidad de mejoras, pero da una idea aproximada. Si crees que debería mejorar, dime que lo cambiaré.

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 

y la salida es

cmpHash 0.234999895096 
cmpByteByByte 0.0 
+10

No hay razón para haga un hash costoso cuando funcione una simple comparación byte a byte. +1 para filecmp –

+8

Si tiene muchos archivos grandes, no hay razón para hacer una costosa comparación byte por byte cuando un simple cálculo hash funcionará. –

+0

Sí, de acuerdo, a menos que tengamos que comparar N archivos entre sí, ¿puede trabajar allí con filecmp o ser más rápido que el hash? –

3

no estoy seguro de si quiere encontrar archivos duplicados o simplemente comparar dos archivos individuales. Si esto último, el enfoque anterior (filecmp) es mejor, si el primero, el siguiente enfoque es mejor.

Aquí hay muchas preguntas sobre la detección de archivos duplicados. Suponiendo que no son muy pequeñas y que el rendimiento es importante, puede

  • comparar los tamaños de archivo en primer lugar, descartando todo lo que no coincide con
  • Si el tamaño de archivo de partido, comparar utilizando el mayor de hash que puede manejar, hash trozos de archivos para evitar leer todo el archivo grande

Aquí es una respuesta con Python implementations (yo prefiero el uno por nosklo, por cierto)

Cuestiones relacionadas