In Python gibt es eine prägnante Art und Weise zu vergleichen, ob der Inhalt von zwei Textdateien, die gleichen sind?
Frage
ist mir egal, was die Unterschiede sind. Ich möchte nur wissen, ob der Inhalt unterschiedlich sind.
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
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"