我正在尝试使用Python以递归方式打印目录中文件的md5哈希值,但是我的open命令中的变量出现问题会产生假哈希值。这是我的代码:
import os
import hashlib
blocksize = 65536
md5_hash = hashlib.md5()
for root, dirs, files in os.walk('/path/to/folder'):
for filename in files:
os.chdir(root)
with open(filename, 'rb') as cur_file:
print filename
while True:
data = cur_file.read(blocksize)
if not data:
break
md5_hash.update(data)
print md5_hash.hexdigest()
如果我更改"文件名"变量到特定文件,如下所示:
with open('nameoffile.txt', 'rb') as cur_file:
然后产生正确的哈希,让我相信我的for循环在某种程度上是错误的。我是否在正确的轨道上?我该怎么做才能修复变量或for循环以使其正常工作?
答案 0 :(得分:0)
尝试
md5_hash = hashlib.md5()
完成散列文件后,因为您当前正在更新同一个文件...
答案 1 :(得分:0)
您永远不会重置哈希对象,即您计算所有文件的串联哈希值。尝试将md5_hash = hashlib.md5()
移动到循环中:
for root, dirs, files in os.walk('/path/to/folder'):
for filename in files:
md5_hash = hashlib.md5()
os.chdir(root)
with open(filename, 'rb') as cur_file:
print filename
while True:
data = cur_file.read(blocksize)
if not data:
break
md5_hash.update(data)
print md5_hash.hexdigest()
另外:为什么chdir? open(os.path.join(root, filename), 'rb')
应该没有额外的系统调用(并且在出现错误时可能存在不确定状态)。