我正在编写一个python脚本,它应该在cwd中查找具有相同内容的所有文件。我的想法是使用哈希函数,但是当我运行脚本时,每个文件都会获得不同的摘要,即使它们是副本,如果我在终端上计算它们也不会发生。我只是无法弄清楚问题出在哪里。这是代码
import sys
import os
import hashlib
from collections import defaultdict
blocksize = 65536
def hashfile(file, hasher):
buf = file.read(blocksize)
while len(buf)>0:
hasher.update(buf)
buf = file.read(blocksize)
#print hasher.hexdigest()
return hasher.hexdigest()
def main():
dir = os.getcwd()
files = os.listdir(dir)
dict = defaultdict(list)
l = []
hasher = hashlib.sha256()
for file in files:
hash = hashfile(open(file, 'rb'), hasher)
l.append((hash, file))
for k, v in l:
dict[k].append(v)
for k in dict.items():
print k
if __name__ == '__main__':
main()
答案 0 :(得分:0)
您正在为所有文件使用单个hasher
,并且它会累积更新。当您处理第二个文件时,您将获得第一个和第二个文件的摘要。
#hasher = hashlib.sha256()
for file in files:
hasher = hashlib.sha256()
hash = hashfile(open(file, 'rb'), hasher)
l.append((hash, file))
将hasher = hashlib.sha256()
行移至for循环。
我认为将hasher = hashlib.sha256()
移至hashfile
函数会更好:
def hashfile(file):
hasher = hashlib.sha256()
buf = file.read(blocksize)
#original code here
它会使代码更清晰。