2008-10-31 10 views
38

मुझे कोई परवाह नहीं है कि मतभेद क्या हैं। मैं सिर्फ यह जानना चाहता हूं कि सामग्री अलग है या नहीं।पायथन में, क्या तुलना करने का एक संक्षिप्त तरीका है कि दो टेक्स्ट फाइलों की सामग्री समान है या नहीं?

उत्तर

49

निम्न स्तर रास्ता:

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): 
    ... 
+9

मैं अपने filecmp.cmp कॉल सही है, क्योंकि एक गैर सच के बिना उथल-पुथल तर्क, यह वह नहीं करता जो प्रश्न पूछता है। – tzot

+2

आप सही हैं। http://www.python.org/doc/2.5.2/lib/module-filecmp.html। आपका बहुत बहुत धन्यवाद। –

+1

बीटीडब्ल्यू, किसी को सुनिश्चित करने के लिए बाइनरी मोड में फ़ाइलों को खोलना चाहिए, क्योंकि फाइल लाइन विभाजक में भिन्न हो सकती है। – newtover

3
 

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

 
+5

"ठीक है, मेरे पास यह 8 जीआईबी फ़ाइल है और 32 जीबीबी फाइल जो मैं तुलना करना चाहता हूं ..." – tzot

22

तुम भी बुनियादी दक्षता के लिए जा रहे हैं, तो आप शायद पहले फ़ाइल आकार जाँच करना चाहते हैं :

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

यह आपको सहेजता है दो फाइलों की प्रत्येक पंक्ति में जो एक ही आकार के नहीं हैं, और इस तरह एक जैसा नहीं हो सकता है।

+2

md5sum दृष्टिकोण केवल 2 फाइलों के साथ धीमा हो जाएगा (आपको अभी भी योग की गणना करने के लिए फ़ाइल को पढ़ने की आवश्यकता है) यह केवल भुगतान करता है जब आप कई फाइलों के बीच डुप्लिकेट की तलाश में हैं। – Brian

+0

@ ब्रायन: आप मानते हैं कि md5sum की फ़ाइल रीडिंग पायथन की तुलना में तेज़ नहीं है, और स्ट्रिंग के रूप में पूरी फ़ाइल को पायथन पर्यावरण में पढ़ने से कोई ओवरहेड नहीं है! इसे 2 जीबी फाइलों के साथ आज़माएं ... – Rich

+2

md5sum की फ़ाइल पढ़ने की अपेक्षा करने के लिए कोई कारण नहीं है पाइथन की तुलना में तेज़ होगा - आईओ भाषा की बहुत स्वतंत्र है। बड़ी फ़ाइल समस्या md5 का उपयोग न करने के लिए, जहां आप अतिरिक्त CPU पेनल्टी का भुगतान नहीं कर रहे हैं, में भाग (या filecmp का उपयोग करें) में पुन: प्रयास करने का एक कारण है। – Brian

1

बड़ी फ़ाइलों के लिए (आगे भी है कि तुलना में, तुम बाहर प्रत्येक फ़ाइल की एक तेजी से md5sum के लिए कह सकते हैं और उन की तुलना, लेकिन है कि "पायथन में" नहीं है, इसलिए मैं यहाँ बंद कर देंगे।) आप कर सकते थे फाइलों के MD5 या SHA हैश की गणना करें।

+3

तो पहले 32 बाइट में केवल दो 32 जीबीबी फाइलें अलग-अलग होती हैं? सीपीयू का समय क्यों खर्च करें और उत्तर के लिए बहुत लंबा इंतजार करें? – tzot

1

मैं 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!' 
5

चूंकि मैं दूसरों के उत्तरों पर टिप्पणी नहीं कर सकता हूं, मैं अपना खुद का लिखूंगा।

यदि आप 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() 
+1

मेरा मानना ​​है कि इस प्रश्न के प्रयोजनों के लिए किसी भी हैशिंग ऑपरेशन ओवरकिल है; प्रत्यक्ष टुकड़ा-दर-टुकड़ा तुलना तेज और अधिक सीधी है। – tzot

+0

मैं सिर्फ सुझाए गए वास्तविक हैशिंग भाग को साफ़ कर रहा था। – user32141

+0

+1 मुझे आपके संस्करण को बेहतर पसंद है। साथ ही, मुझे नहीं लगता कि हैश का उपयोग करना अधिक है। वास्तव में कोई अच्छा कारण नहीं है कि अगर आप जानना चाहते हैं कि वे अलग हैं या नहीं। –

7

यह एक कार्यात्मक-शैली फ़ाइल तुलना फ़ंक्शन है। फाइलों के अलग-अलग आकार होने पर यह तुरंत झूठा होता है; अन्यथा, यह 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]) 

बस अलग राय :)

0
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"