如果有一个包含文件路径的数据框,我想为每个文件创建哈希值。
代码看起来像这样。
def generate_hash(path):
path = paht['path']
BLOCK_SIZE = 10485760
file_hash = hashlib.sha256()
with open(file, 'rb') as f:
fb = f.read(BLOCK_SIZE)
while len(fb) > 0:
file_hash.update(fb)
fb = f.read(BLOCK_SIZE)
return file_hash.hexdigest()
df['hash'] = df.apply((generate_hash, axis=1)
这样每个文件都会产生相同的哈希值 df看起来是这样的:
path hash
0 /path/file_1 09b85c3f91d4fc5fe88610acad1094d064b253ebfacf26ed2cb16c4e89468504
1 /path/file_2 09b85c3f91d4fc5fe88610acad1094d064b253ebfacf26ed2cb16c4e89468504
2 /path/file_3 09b85c3f91d4fc5fe88610acad1094d064b253ebfacf26ed2cb16c4e89468504
3 /path/file_4 09b85c3f91d4fc5fe88610acad1094d064b253ebfacf26ed2cb16c4e89468504
4 /path/file_5 09b85c3f91d4fc5fe88610acad1094d064b253ebfacf26ed2cb16c4e89468504
但由于它们是不同的文件,它们不应该产生相同的哈希值,而当我只是在路径上迭代的时候 for loop
正确生成
这段代码。
for file in glob.glob('path/**', recursive=True):
print(file)
print(generate_hash(file))
产生预期的结果。
/path/file_1
fdf755afcb1a4a38474ab1f2bca4969eec6e3dac09772559f473c33915b1323d
/path/file_2
957c584f39d2a8938174a9b715b9d67998ebb7ba94619f15e076a5c649714067
/path/file_3
fab912b026cbd2ba4c507ffa6f996e862133e1db2c705881819fa258eb76bebc
/path/file_4
d7dc9e575e4e36ed5542e9102044926598b0a600e1e0f59db3993be53518b7e6
/path/file_5
09b85c3f91d4fc5fe88610acad1094d064b253ebfacf26ed2cb16c4e89468504
所以在df的例子中,每一行都会得到实际的哈希值。file_5
我缺少什么?
你必须替换掉 open(file, 'rb')
与 open(path, 'rb')
这里 path
代表的值。path
从本系列 s
传给 generate_hash
功能。
使用。
def generate_hash(s):
path = s['path']
BLOCK_SIZE = 10485760
file_hash = hashlib.sha256()
with open(path, 'rb') as f:
fb = f.read(BLOCK_SIZE)
while len(fb) > 0:
file_hash.update(fb)
fb = f.read(BLOCK_SIZE)
return file_hash.hexdigest()