2010-11-26 20 views
5

पाइथन में समानता के लिए फ़ाइलों की जांच करने का सबसे शानदार तरीका क्या है? चेकसम? बाइट्स की तुलना? लगता है कि फाइलें 100-200 एमबीसमानता

उत्तर

4

उपयोग hashlib प्रत्येक फ़ाइल की md5 मिलता है, और परिणामों की तुलना करने के लिए।

#! /bin/env python 
import hashlib 
def filemd5(filename, block_size=2**20): 
    f = open(filename) 
    md5 = hashlib.md5() 
    while True: 
     data = f.read(block_size) 
     if not data: 
      break 
     md5.update(data) 
    f.close() 
    return md5.digest() 

if __name__ == "__main__": 
    a = filemd5('/home/neo/todo') 
    b = filemd5('/home/neo/todo2') 
    print(a == b) 

अद्यतन: अजगर 2.1 के रूप में वहाँ है एक filecmp module करता है कि आप बस क्या चाहते हैं, और निर्देशिका भी तुलना करने के लिए तरीकों है। मैं इस मॉड्यूल के बारे में पता नहीं था, मैं अभी भी अपने आप को अजगर सीख रहा हूँ :-)

>>> import filecmp 
>>> filecmp.cmp('undoc.rst', 'undoc.rst') 
True 
>>> filecmp.cmp('undoc.rst', 'index.rst') 
False 
+0

MD5 हैश करने का उद्देश्य क्या है? एक ब्लॉक अलग होने तक ब्लॉक द्वारा ब्लॉक की गई दो फ़ाइलों को क्यों न केवल पढ़ा जाए? यह एमडी 5 गणना चरण को छोड़ देगा, * और * (स्वीकार्य रूप से असंभव) हैश टकराव के खिलाफ मजबूत होगा। – EOL

+2

@EOL आपके पास एक वैध बिंदु है, जो भी काम करेगा। एकमात्र लाभ जो मैं देखता हूं, हैश + फ़ाइल संशोधित दिनांक को संग्रहीत करके, और भविष्य में उन पूर्व-गणना मानों का उपयोग करके। – invert

4

से बड़ी हों, ठीक है, इसके लिए दो अलग-अलग उत्तरों की आवश्यकता हो सकती है।

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

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

दोनों मामलों में, असमानता की जांच के प्रारंभिक तरीके के रूप में फ़ाइल आकार का उपयोग करें।

+0

यहां तक ​​कि जब एक से अधिक फ़ाइलों की तुलना, चेकसम काउंटर उत्पादक हो सकता है:

और भी बेहतर है, यह मानक पुस्तकालय का हिस्सा है। यदि आप बस 'a == b == c == d' जांचना चाहते हैं, तो मुझे इसका बिंदु दिखाई नहीं देता है। यदि आप 'ई (ए, बी, सी, डी)' जैसे कुछ चाहते हैं, और फिर आप इसे 'ई, एफ, जी' आदि के साथ करना चाहते हैं, तो मुझे लगता है कि चेकसम स्वयं के लिए भुगतान करना शुरू कर देता है। – aaronasterling

+1

ठीक है, एकाधिक फ़ाइलों की तुलना करने के लिए सबसे आम मामला डुप्लिकेट ढूंढना है। कम से कम मैंने यह सुनिश्चित करने की आवश्यकता को शायद ही कभी देखा है कि कई फाइलें समान रूप से समान हैं। – Joey

-2

मैं बाइट कॉमप्रेशन के अलावा एमडी 5 (उदाहरण के लिए) के साथ चेकसम करूँगा और तारीख की जांच पर निर्भर करता हूं और आपको उस पर निर्भर करता है।

+2

फ़ाइल की तारीख को इसकी सामग्री के साथ क्या करना है? – Joey

+0

चेकसम अच्छा समाधान है, मैं सहमत हूं, लेकिन "चेक तिथियां" कहने का क्या मतलब है? –

+2

क्या आपको अपने चेकसम को वैसे भी प्राप्त करने के लिए दोनों फाइलें पढ़ने की ज़रूरत नहीं है? यदि ऐसा है, तो मुझे लगता है कि सभी चेकसम टकराव का खतरा जोड़ता है। संपादित करें: जब तक आप कई फ़ाइलों की तुलना नहीं करना चाहते हैं क्योंकि जॉय ने अभी जवाब में कहा है। – aaronasterling

-2

cmp पर खोलने के बारे में क्या?

import commands 
status, output = commands.getstatusoutput("/usr/bin/cmp file1 file2") 
if (status == 0): 
    print "files are same" 
elif (status == 1): 
    print "files differ" 
else: 
    print "uh oh!" 
+1

विंडोज सिस्टम पर शुभकामनाएं ;-) – Joey

+0

साइगविन इंस्टॉल करें। –

+1

एक क्रॉस प्लेटफ़ॉर्म समाधान नहीं ... –

0

अन्य समाधान के किसी भी प्रयास करने से पहले, आप दोनों फ़ाइलों पर os.path.getsize(...) क्या करना चाहते हो सकता है। यदि यह भिन्न है, तो बाइट्स की तुलना करने या चेकसम की गणना करने की कोई आवश्यकता नहीं है।

बेशक, यह केवल तभी मदद करता है जब फाइलसाइज तय नहीं किया जाता है।

उदाहरण:

def foo(f1, f2): 
    if not os.path.getsize(f1) == os.path.getsize(f2): 
     return False # Or similar 

    ... # Checksumming/byte-comparing/whatever 
9

filecmp के बारे में क्या मॉड्यूल? यह अलग-अलग ट्रेडऑफ के साथ कई अलग-अलग तरीकों से फाइल तुलना कर सकता है।

http://docs.python.org/library/filecmp.html

+0

दिलचस्प मॉड्यूल, लेकिन यह आपको प्रश्न में पूछने से कम देता है: "अगर फाइलें [फ़ाइलें] * बराबर लगती हैं तो सही लौटती है, अन्यथा गलत होती है"। मैं इसे अर्थ के रूप में लेता हूं कि तुलना अनुमानित है। यह जानना दिलचस्प होगा कि यह कितना अनुमानित है। इसके अलावा, मैं यह नहीं ढूंढ पाया कि "विभिन्न व्यापार-बंदों के साथ कई अलग-अलग तरीकों से तुलना" कैसे की जा सकती है: क्या आप इस पर विस्तार कर सकते हैं? – EOL

+0

एमडी 5 प्राप्त करने के लिए हैशिल का उपयोग करना 'अनुमानित' भी है। सुनिश्चित करने का एकमात्र तरीका बाइट-बाय-बाइट तुलना करना है। filecmp 'उथले' पैरामीटर के माध्यम से झूठी गुजरकर, इसका समर्थन करता है। – wump

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