web-dev-qa-db-fra.com

En Python, existe-t-il un moyen concis de comparer si le contenu de deux fichiers texte est le même?

Je me fiche de quelles sont les différences. Je veux juste savoir si le contenu est différent.

49
Corey Trager

Le niveau bas de niveau:

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

Le niveau de niveau élevé:

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

Si vous voulez une efficacité de base même, vous souhaitez probablement vérifier la taille du fichier en premier:

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

Cela vous évite de lire toutes les lignes de deux fichiers qui ne sont même pas de la même taille et que vous ne pouvez donc pas être identique.

(Même plus loin que cela, vous pouvez appeler à un MD5Sum rapide de chaque fichier et comparer ceux-ci, mais ce n'est pas "en python", alors je vais arrêter ici.)

24
Rich

Ceci est une fonction de comparaison de fichiers de style fonctionnel. Il retourne instantanément faux si les fichiers ont des tailles différentes; Sinon, il se lit dans des tailles de bloc 4Kib et retourne de faux instantanément sur la première différence:

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 __== "__main__":
    import sys
    print filecmp(sys.argv[1], sys.argv[2])

Juste une autre prise :)

9
tzot

Puisque je ne peux pas commenter les réponses des autres, j'écrirai le mien.

Si vous utilisez MD5, vous ne devez absolument pas que MD5.UPDate (F.Read ()) puisque vous utiliserez trop de mémoire.

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()
6
user32141

J'utiliserais un hachage du contenu du fichier à l'aide de 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!'
2
Jeremy Cantrell
[.____] 
f = open(filename1, "r").read()
f2 = open(filename2,"r").read()
print f == f2

2
mmattax

Pour les fichiers plus gros, vous pouvez calculer A MD5 ou [~ # ~ ~] Sha [~ # ~ ~] Hash des fichiers.

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"
1
Prashanth Babu