Es ist mir egal, was die Unterschiede sind. Ich möchte nur wissen, ob die Inhalte unterschiedlich sind.Gibt es in Python eine übersichtliche Methode, um zu vergleichen, ob der Inhalt von zwei Textdateien identisch ist?
Antwort
Das niedrige Niveau Weg:
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):
...
f = open(filename1, "r").read()
f2 = open(filename2,"r").read()
print f == f2
"Nun, ich habe diese 8 GiB-Datei und diese 32 GiB-Datei, die ich vergleichen möchte ..." – tzot
Wenn Sie selbst grundlegende Effizienz gehen, werden Sie wahrscheinlich die Dateigröße überprüfen möchten 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 Ihnen lesen Jede Zeile von zwei Dateien, die nicht einmal die gleiche Größe haben, kann also nicht identisch 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.)
Der Ansatz von md5sum wird langsamer mit nur 2 Dateien (Sie müssen immer noch die Datei lesen, um die Summe zu berechnen) Es lohnt sich nur wenn Sie nach Duplikaten unter mehreren Dateien suchen. – Brian
@Brian: Sie gehen davon aus, dass das Lesen von md5sum nicht schneller ist als das von Python, und dass es keinen Overhead beim Lesen der gesamten Datei in die Python-Umgebung als String gibt! Versuchen Sie das mit 2GB-Dateien ... – Rich
Es gibt keinen Grund zu erwarten, dass die Dateilesung von md5sum schneller ist als die von Python - IO ist ziemlich unabhängig von der Sprache. Das große Dateiproblem ist ein Grund, in Chunks zu iterieren (oder filecmp zu benutzen), nicht um md5 zu benutzen, wo du unnötig eine zusätzliche CPU-Strafe bezahlst. – Brian
Ich würde einen Hash des Inhalts der Datei mit MD5 verwenden.
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!'
Da ich die Antworten anderer nicht kommentieren kann, schreibe ich meine eigene.
Wenn Sie md5 verwenden, müssen Sie definitiv nicht nur md5.update (f.read()), da Sie zu viel Speicher verwenden.
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()
Ich glaube, dass jede Hashing-Operation für die Zwecke dieser Frage übertrieben ist. direkter Stück-für-Stück-Vergleich ist schneller und geradliniger. – tzot
Ich habe gerade den tatsächlichen Hashing-Teil aufgeräumt, den jemand vorgeschlagen hat. – user32141
+1 Ich mag deine Version besser. Ich glaube auch nicht, dass die Verwendung eines Hashes zu viel ist. Es gibt wirklich keinen guten Grund, nicht, wenn alles, was Sie wissen wollen, ist, ob sie anders sind oder nicht. –
Dies ist eine funktionelle Dateivergleichsfunktion. Es gibt sofort False zurück, wenn die Dateien unterschiedliche Größen haben; sonst liest sie in 4KiB Blockgrößen und False zurückgibt sofort auf den ersten Unterschied:
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 :)
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. den Inhalt von zwei riesigen Textdateien schnell zu vergleichen
- 2. Vergleichen von zwei Textdateien in Windows-Anwendung
- 3. Vergleichen zweier Textdateien in Python
- 4. Python: Der beste Weg, um 2 Textdateien zu vergleichen?
- 5. Wie kann ich mit Perl feststellen, ob der Inhalt von zwei Dateien identisch ist?
- 6. Vergleichen Spalten in zwei Textdateien und Übereinstimmungsleitungen
- 7. C#: Inhalt von zwei IEnumerables vergleichen
- 8. Gibt es in Python eine "Wildcard-Methode"?
- 9. Gibt es eine integrierte Möglichkeit, zwei Iteratoren zu vergleichen?
- 10. sehen, ob zwei Dateien den gleichen Inhalt in Python haben
- 11. Gibt es zwei Arten von equals() Methode
- 12. Gibt es eine gemeinsame LISP-Funktion, um den Inhalt zweier Listen zu vergleichen?
- 13. Gibt es eine einfache Methode, um zu überprüfen, ob eine Ruby IO-Instanz bei read() blockiert?
- 14. Vergleichen Sie zwei Textdateien mit Linq?
- 15. Gibt es eine Google API, um zwischengespeicherten Inhalt zu lesen?
- 16. Vergleichen Sie zwei Textdateien, Zeile für Zeile
- 17. vergleichen den Inhalt von zwei Listen
- 18. Python zu vergleichen Sets
- 19. Inhalt von zwei Dateien in Dreamweaver vergleichen
- 20. Wie kann ich zwei Textdateien vergleichen?
- 21. Gibt es eine Python-Methode, um Schlüsselwortargumente für einen Memoize-Decorator in Python zu unterstützen?
- 22. Python: Gibt es eine bekannte Funktion, um JSON-Darstellung von Daten zu normalisieren?
- 23. vergleichen Inhalt von zwei Variablen in der Bash
- 24. Gibt es eine Möglichkeit zu überprüfen, ob zwei Collections dieselben Elemente enthalten, unabhängig von der Reihenfolge?
- 25. JFileChooser zum Auswählen mehrerer Textdateien und Vergleichen
- 26. Was ist der effizienteste Weg, um zwei Strings zu vergleichen?
- 27. Gibt es eine Möglichkeit, ein IPhone zu "pingen", um zu sehen, ob es eingeschaltet ist?
- 28. Vb.net, wie große Textdateien zu vergleichen
- 29. Wie zu beurteilen, ob zwei Schriftarten in GDI identisch sind +
- 30. Gibt es eine integrierte Methode, um die Eigenschaften von zwei Objekten zu einem einzigen Objekt zusammenzuführen?
ich Ihre filecmp.cmp Anruf korrigiert, denn ohne eine unechte oberflächliches Argument, es tut nicht, wonach die Frage fragt. – tzot
Sie haben Recht. http://www.python.org/doc/2.5.2/lib/module-filecmp.html. Vielen Dank. –
BTW, sollte man die Dateien im Binärmodus öffnen, um sicher zu sein, da die Dateien in Zeilentrennzeichen unterscheiden können. – newtover