2009-07-02 6 views
24

संभव डुप्लिकेट हैं, तो:
Finding duplicate files and removing them.
In Python, is there a concise way of comparing whether the contents of two text files are the same?देखने दो फ़ाइलों अजगर में एक ही सामग्री

क्या होगा अगर दो फ़ाइलों पायथन में एक ही सामग्री के लिहाज से कर रहे हैं देखने के लिए सबसे आसान तरीका है ।

एक चीज जो मैं कर सकता हूं वह है md5 प्रत्येक फ़ाइल और तुलना करें। क्या कोई बेहतर तरीका है?

+1

यह http://stackoverflow.com/questions/ का डुप्लिकेट है है से बचने के लिए 254350 – pufferfish

उत्तर

54

हां, मुझे लगता है कि फ़ाइल को हैशिंग करना सबसे अच्छा तरीका होगा यदि आपको बाद में तुलना के लिए कई फाइलों और स्टोर हैंश की तुलना करना है। चूंकि हैश संघर्ष कर सकता है, उपयोग के मामले के आधार पर बाइट-बाय-बाइट तुलना की जा सकती है।

आम तौर पर बाइट-बाय-बाइट तुलना पर्याप्त और कुशल होगी, जो filecmp मॉड्यूल पहले से ही अन्य चीजें भी करता है।

http://docs.python.org/library/filecmp.html उदा।

>>> import filecmp 
>>> filecmp.cmp('file1.txt', 'file1.txt') 
True 
>>> filecmp.cmp('file1.txt', 'file2.txt') 
False 

स्पीड विचार: आमतौर पर यदि केवल दो फ़ाइलों तुलना करने के लिए, उन्हें hashing और की तुलना में उन्हें धीमी बजाय सरल बाइट-दर-बाइट तुलना की अगर कुशलता से किया हो जाएगा। जैसे नीचे कोड हैश बनाम हैट बनाम बाइट-बाय-बाइट

अस्वीकरण: यह समय या दो अलगो की तुलना करने का सबसे अच्छा तरीका नहीं है। और सुधार की आवश्यकता है लेकिन यह किसी न किसी विचार को देता है। अगर आपको लगता है कि इसे सुधारना चाहिए तो मुझे बताओ कि मैं इसे बदल दूंगा।

import random 
import string 
import hashlib 
import time 

def getRandText(N): 
    return "".join([random.choice(string.printable) for i in xrange(N)]) 

N=1000000 
randText1 = getRandText(N) 
randText2 = getRandText(N) 

def cmpHash(text1, text2): 
    hash1 = hashlib.md5() 
    hash1.update(text1) 
    hash1 = hash1.hexdigest() 

    hash2 = hashlib.md5() 
    hash2.update(text2) 
    hash2 = hash2.hexdigest() 

    return hash1 == hash2 

def cmpByteByByte(text1, text2): 
    return text1 == text2 

for cmpFunc in (cmpHash, cmpByteByByte): 
    st = time.time() 
    for i in range(10): 
     cmpFunc(randText1, randText2) 
    print cmpFunc.func_name,time.time()-st 

और आउटपुट

cmpHash 0.234999895096 
cmpByteByByte 0.0 
+10

कोई कारण नहीं है एक महंगी हैश करें जब एक साधारण बाइट-बाय-बाइट तुलना काम करेगी। Filecmp –

+8

के लिए +1 यदि आपके पास बहुत बड़ी फ़ाइलें हैं तो एक साधारण हैश गणना काम करने पर महंगा बाइट-बाय-बाइट तुलना करने का कोई कारण नहीं है। –

+0

हां सहमत हैं, जब तक हमें एक दूसरे के साथ एन फाइलों की तुलना नहीं करनी पड़े, तो क्या filecmp वहां काम कर सकता है या हैश से तेज़ हो सकता है? –

3

है मुझे यकीन है कि अगर आप डुप्लिकेट फ़ाइलें खोजने के लिए या सिर्फ दो एकल फ़ाइलों की तुलना चाहते हैं नहीं कर रहा हूँ। यदि उत्तरार्द्ध, उपर्युक्त दृष्टिकोण (filecmp) बेहतर है, यदि पूर्व, निम्न दृष्टिकोण बेहतर है।

यहां बहुत सारी डुप्लिकेट फ़ाइलें पहचान प्रश्न हैं। मान लिया जाये कि वे बहुत छोटे नहीं हैं और है कि प्रदर्शन के लिए महत्वपूर्ण है, तो आप कर सकते हैं

  • फ़ाइल आकार पहले की तुलना करें जो सभी
  • से मेल नहीं खाता फ़ाइल मैच आकार तो त्यागकर, सबसे बड़ी हैश आप संभाल कर सकते हैं का उपयोग कर की तुलना hashing फ़ाइलों का हिस्सा पूरी बड़ा फ़ाइल को पढ़ने

यहाँ Python implementations साथ एक जवाब (मैं nosklo के बाद एक, BTW पसंद करते हैं)

संबंधित मुद्दे