我有一组n
个文件的目录,我需要比较每个文件(在一个目录中)并查找它们是否有任何区别。
我尝试了filecmp
和difflib
,但他们只支持两个文件。
我还能做些什么来比较/区分文件吗?
此文件包含主机名
--------------------------------
Example :- Dir -> Server.1
|-> file1
|-> file2
|-> file3
file1 <- host1
host2
host3
file2 <- host1
host2
host3
host4
file3 <- host1
host2
host3
答案 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
被认为是等同的。