比较python中的多个文件

时间:2012-09-18 13:10:32

标签: python python-2.7

我有一组n个文件的目录,我需要比较每个文件(在一个目录中)并查找它们是否有任何区别。 我尝试了filecmpdifflib,但他们只支持两个文件。

我还能做些什么来比较/区分文件吗?

此文件包含主机名

--------------------------------
Example :- Dir -> Server.1
                    |-> file1
                    |-> file2
                    |-> file3


file1 <- host1 
         host2
         host3

file2 <- host1 
         host2 
         host3 
         host4

file3 <- host1 
         host2 
         host3

2 个答案:

答案 0 :(得分:2)

我想我会分享如何将md5哈希与os.path.walk()相结合,可以帮助你找出目录树中的所有重复项。目录和文件的数量越大,首先按大小排序文件就越有帮助,以排除任何不能复制的文件,因为它们的大小不同。希望这会有所帮助。

import os, sys
from hashlib import md5

nonDirFiles = []

def crawler(arg, dirname, fnames):
    '''Crawls directory 'dirname' and creates global 
    list of paths (nonDirFiles) that are files, not directories'''
    d = os.getcwd()
    os.chdir(dirname)

    global nonDirFiles
    for f in fnames:
        if not os.path.isfile(f):

            continue
        else:       
            nonDirFiles.append(os.path.join(dirname, f))
    os.chdir(d)

def startCrawl():
    x = raw_input("Enter Dir: ")
    print 'Scanning directory "%s"....' %x
    os.path.walk(x, crawler, nonDirFiles)

def findDupes():
    dupes = []
    outFiles = []
    hashes = {}
    for fileName in nonDirFiles:
        print 'Scanning file "%s"...' % fileName
        f = file(fileName, 'r')
        hasher = md5()
        data = f.read()
        hasher.update(data)
        hashValue = hasher.digest()

        if hashes.has_key(hashValue):

            dupes.append(fileName)
        else:
            hashes[hashValue] = fileName

    return dupes

if __name__ == "__main__":
    startCrawl()
    dupes = findDupes()
    print "These files are duplicates:"
    for d in dupes:print d

答案 1 :(得分:1)

您的问题没有说明您是需要确定差异还是仅查找哪些文件相同/不同 - 所以我将专注于像文件一样分组。

您可以使用散列将相同的文件组合在一起:

from hashlib import md5
from pprint import pprint

def get_filenames():
    return ('file1', 'file2', 'file3')

hashes = {}
for f in get_filenames():
    hd = md5(open(f).read()).hexdigest()
    hashes[hd] = hashes.get(hd, []) + [f]

pprint(hashes)
{'420248eb2e8226ac441cb7516fb7ff23': ['file2'],
 '4f2d7139dc1aa23235e7fad418a5bd10': ['file1', 'file3']}

鉴于您的文件包含主机名列表,您可能希望事先对文件进行排序,例如,

file1 <- host1 
         host2
         host3

file3 <- host3 
         host2
         host1

被认为是等同的。