08
2016
04

用hash码去除重复文件

整理一个老程序中的素材时发现,他们把所有文件都复制了n多份,冗余太多,没法忍,想要去除一下重复的文件。

最开始利用python获取文件的大小,然后放到excel中,按大小排序,比较。

处理swf文件时,还是比较靠谱的,当处理mp3文件时,发现好多mp3文件大小一样,但是内容不一样。

最开始先按大小排序分组,然后用“BCompare.exe”手动进行二进制比对,但是当同一个组里边从在很多文件的时候,工作量就太大了(n!),700多个文件,分了58组,加了一个小时班,都没整完。

后来和同事聊了聊天,同事说可以获取文件的hash码或md5码,然后排序,进行比对。

一语惊醒梦中人,其实我也知道这种方法的,网盘上就用到了这种技术,经常见到的那种秒传,也是这么实现的。

搜到了一段python代码,几分钟就解决了。

python代码如下(3.4版本):

import hashlib
import os,sys
 
def CalcSha1(filepath):
	with open(filepath,'rb') as f:
		sha1obj = hashlib.sha1()
		sha1obj.update(f.read())
		hash = sha1obj.hexdigest()
		print(hash)
		return hash
 
def CalcMD5(filepath):
	with open(filepath,'rb') as f:
		md5obj = hashlib.md5()
		md5obj.update(f.read())
		hash = md5obj.hexdigest()
		print(hash)
		return hash

f=open("list.txt")
lines=f.readlines()
f.close()

arr=[];
for line in lines:
	if ".mp3" in line:
		line=line.replace("\n","")
		print(line)
		has=CalcSha1(line)
		arr.append(line+"\t"+has)

fo=open("hash.txt","w")
fo.write("\n".join(arr))
fo.close()
input("完成,保存到hash.txt,按任意键退出...")

计算hash码和md5码的两个函数是直接从网上复制的,找不到地址了。

“list.txt”是用批处理获取的要处理的文件列表(当然可以直接俄用python来遍历文件目录,不过我还是习惯用批处理)。

获取到“hash.txt”之后,就可以放到excel中处理了。


« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。