In Python gibt es eine prägnante Art und Weise zu vergleichen, ob der Inhalt von zwei Textdateien, die gleichen sind?

StackOverflow https://stackoverflow.com/questions/254350

  •  05-07-2019
  •  | 
  •  

Frage

ist mir egal, was die Unterschiede sind. Ich möchte nur wissen, ob der Inhalt unterschiedlich sind.

War es hilfreich?

Lösung

Die geringe Art und Weise:

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

Die hohe Art und Weise:

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

Andere Tipps

Wenn Sie selbst grundlegende Effizienz gehen, wollen Sie wahrscheinlich die Dateigröße überprüfen Sie zuerst:

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

Das spart jede Zeile von zwei Dateien zu lesen, die nicht einmal die gleiche Größe, und kann somit nicht das gleiche sein.

(Noch weiter als das, könnte man auf eine schnelle MD5sum jeder Datei rufen und diejenigen vergleichen, aber das ist nicht „in Python“, also werde ich hier aufhören.)

Dies ist eine funktionale Stil Dateivergleichsfunktion. Es gibt sofort False, wenn die Dateien unterschiedliche Größen haben; andernfalls liest es in 4KiB Blockgrößen und gibt sofort auf dem ersten Unterschied False:

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])

Nur eine andere Perspektive:)

Da ich nicht auf den Antworten von anderen kommentieren kann ich meine eigenen schreiben.

Wenn Sie md5 verwenden, müssen Sie auf jeden Fall nicht nur md5.update (f.read ()), da Sie zu viel Speicher verwenden werden.

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

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


Für größere Dateien können Sie berechnen, ein MD5 oder SHA Hash der Dateien

würde ich einen Hash des Inhalts der Datei verwenden, mit 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!'
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"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top