python file compare

title python



En Python, ¿hay una forma concisa de comparar si el contenido de dos archivos de texto es el mismo? (8)

Como no puedo comentar las respuestas de los demás, escribiré la mía.

Si usa md5 definitivamente no debe simplemente md5.update (f.read ()) ya que usará demasiada memoria.

def get_file_md5(f, chunk_size=8192): h = hashlib.md5() while True: chunk = f.read(chunk_size) if not chunk: break h.update(chunk) return h.hexdigest()

No me importa cuáles son las diferencias. Solo quiero saber si los contenidos son diferentes.


Esta es una función de comparación de archivos de estilo funcional. Vuelve al instante False si los archivos tienen diferentes tamaños; de lo contrario, se lee en tamaños de bloque 4KiB y devuelve False al instante en la primera diferencia:

from __future__ import with_statement import os import itertools, functools, operator def filecmp(filename1, filename2): "Do the two files have exactly the same contents?" with open(filename1, "rb") as fp1, open(filename2, "rb") as fp2: if os.fstat(fp1.fileno()).st_size != os.fstat(fp2.fileno()).st_size: return False # different sizes ∴ not equal fp1_reader= functools.partial(fp1.read, 4096) fp2_reader= functools.partial(fp2.read, 4096) cmp_pairs= itertools.izip(iter(fp1_reader, ''''), iter(fp2_reader, '''')) inequalities= itertools.starmap(operator.ne, cmp_pairs) return not any(inequalities) if __name__ == "__main__": import sys print filecmp(sys.argv[1], sys.argv[2])

Una toma diferente :)


La forma de bajo nivel:

from __future__ import with_statement with open(filename1) as f1: with open(filename2) as f2: if f1.read() == f2.read(): ...

La forma de alto nivel:

import filecmp if filecmp.cmp(filename1, filename2, shallow=False): ...


Para archivos más grandes, puede calcular un hash MD5 o SHA de los archivos.


Si está buscando incluso la eficiencia básica, probablemente quiera verificar primero el tamaño del archivo:

if os.path.getsize(filename1) == os.path.getsize(filename2): if open(''filename1'',''r'').read() == open(''filename2'',''r'').read(): # Files are the same.

Esto le ahorra leer cada línea de dos archivos que ni siquiera tienen el mismo tamaño y, por lo tanto, no pueden ser iguales.

(Incluso más allá de eso, podría llamar a un rápido MD5sum de cada archivo y compararlos, pero eso no es "en Python", así que me detendré aquí).


Usaría un hash de los contenidos del archivo usando MD5.

import hashlib def checksum(f): md5 = hashlib.md5() md5.update(open(f).read()) return md5.hexdigest() def is_contents_same(f1, f2): return checksum(f1) == checksum(f2) if not is_contents_same(''foo.txt'', ''bar.txt''): print ''The contents are not the same!''


f = open(filename1, "r").read() f2 = open(filename2,"r").read() print f == f2


from __future__ import with_statement filename1 = "G://test1.TXT" filename2 = "G://test2.TXT" with open(filename1) as f1: with open(filename2) as f2: file1list = f1.read().splitlines() file2list = f2.read().splitlines() list1length = len(file1list) list2length = len(file2list) if list1length == list2length: for index in range(len(file1list)): if file1list[index] == file2list[index]: print file1list[index] + "==" + file2list[index] else: print file1list[index] + "!=" + file2list[index]+" Not-Equel" else: print "difference inthe size of the file and number of lines"