通过pandas dataframe apply生成文件哈希为所有文件创建相同的哈希

时间:2020-05-19 10:39:28

标签: python pandas hash

如果数据框中充满了文件路径,而我想为每个文件创建哈希值

代码看起来像这样:

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的实际哈希值,我在这里缺少什么?pn

1 个答案:

答案 0 :(得分:1)

您必须将open(file, 'rb')替换为open(path, 'rb'),这里path代表传递给{{1的当前序列paths的值}}功能。

使用:

generate_hash