في بيثون، هل هناك طريقة مختصرة لمقارنة ما إذا كانت محتويات ملفين النص هي نفسها؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا لا يهمني ما هي الاختلافات. أنا فقط أريد أن أعرف ما إذا كانت محتويات مختلفة.

هل كانت مفيدة؟

المحلول

والطريقة مستوى منخفض:

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

والطريقة رفيعة المستوى:

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

نصائح أخرى

إذا كنت تريد الذهاب لكفاءة حتى الأساسية، ربما كنت ترغب في التحقق من حجم الملف أولا:

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

وهذا يوفر عليك قراءة كل سطر من ملفين التي ليست حتى من نفس الحجم، وبالتالي لا يمكن أن تكون هي نفسها.

و(حتى أبعد من ذلك، هل يمكن أن أصل الكلمة إلى MD5SUM سريع من كل ملف ومقارنة تلك، ولكن هذا ليس "في بيثون"، لذلك سأتوقف هنا.)

وهذه هي وظيفة مقارنة ملف على غرار الوظيفي. فإنه يعود الكاذبة على الفور في حالة وجود ملفات أحجام مختلفة؛ خلاف ذلك، فإنه يقرأ في أحجام كتلة 4KiB ويعود الكاذبة على الفور على الفرق الأول:

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

ومجرد لقطة مختلفة:)

وبما أنني لا أستطيع التعليق على إجابات الآخرين سأكتب بلدي.

إذا كنت تستخدم MD5 أنت بالتأكيد لا يجب فقط md5.update (f.read ()) وبما انك سوف تستخدم الكثير من الذاكرة.

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


لملفات أكبر هل يمكن حساب على MD5 أو <وأ href = "HTTP : //docs.python.org/library/sha.html "يختلط =" نوفولو noreferrer "> SHA تجزئة الملفات

وأود أن استخدام تجزئة محتويات الملف باستخدام 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"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top