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

问题描述 投票:0回答:1

如果有一个包含文件路径的数据框,我想为每个文件创建哈希值。

代码看起来像这样。

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 我缺少什么?

python pandas hash
1个回答
1
投票

你必须替换掉 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() 
© www.soinside.com 2019 - 2024. All rights reserved.