正在获取md5校验和的完成百分比

2024-10-03 11:13:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我当前正在获取md5校验和,如下所示:

>>> import hashlib
>>> f = open(file)
>>> m = hashlib.md5()
>>> m.update(f.read())
>>> checksum = m.hedxigest()

我需要返回一个大的视频文件的校验和,这将需要几分钟来生成。我如何实现一个百分比计数器,以便它在运行时打印每个百分比的完成百分比。比如:

^{pr2}$

Tags: importread计数器updateopen校验md5file
3条回答

好吧,不是hedxigest()调用需要一段时间,而是读取文件。在

记住这一点,将m.update(f.read())替换为一个循环,在这个循环中,您可以逐块读取文件,更新校验和,并定期打印出进度报告。在

您可以反复调用update()方法并将文件分块提供给它。这样,你就可以自己展示进度了。在

import hashlib
import os

def digest_with_progress(filename, chunk_size):
    read_size = 0
    last_percent_done = 0
    digest = hashlib.md5()
    total_size = os.path.getsize(filename)

    data = True
    f = open(filename)
    while data:
        # Read and update digest.
        data = f.read(chunk_size)
        read_size += len(data)
        digest.update(data)

        # Calculate progress.
        percent_done = 100 * read_size / total_size
        if percent_done > last_percent_done:
            print '%d%% done' % percent_done
            last_percent_done = percent_done
    f.close()
    return digest.hexdigest()

当我尝试print digest_with_progress('/bin/bash', 1024)这就是我得到的:

^{pr2}$

下面是这个文件的实际细节。在

$ ls -l /bin/bash; md5sum /bin/bash
-rwxr-xr-x 1 root root 971384 Nov 30 16:31 /bin/bash
b114ecaab65bc5b02f5a129bd29d1864  /bin/bash

请注意,如果将chunk_size设得太大,则无法获得预期的输出。例如,如果我们读入100kb的块而不是/bin/bash的1kb块,这就是您看到的。在

10% done
21% done
31% done
42% done
52% done
63% done
73% done
84% done
94% done
100% done
b114ecaab65bc5b02f5a129bd29d1864

这种方法的局限性在于,我们只有在将块读入摘要之后才能计算进度。因此,如果块大小太大,每次读取块并更新摘要时,进行中的百分比差异将超过1%。更大的块大小会使工作更快完成。因此,为了提高效率,您可能需要放宽每个百分比的打印完成百分比的条件。在

您应该使用f.read(N_BYTES)分块读取文件,跟踪文件中的距离,并将这些块传递给m.update。这是昂贵的操作,而不是md5.hexdigest。在

相关问题 更多 >