2024-10-03 11:13:16 发布
网友
我当前正在获取md5校验和,如下所示:
>>> import hashlib >>> f = open(file) >>> m = hashlib.md5() >>> m.update(f.read()) >>> checksum = m.hedxigest()
我需要返回一个大的视频文件的校验和,这将需要几分钟来生成。我如何实现一个百分比计数器,以便它在运行时打印每个百分比的完成百分比。比如:
好吧,不是hedxigest()调用需要一段时间,而是读取文件。在
hedxigest()
记住这一点,将m.update(f.read())替换为一个循环,在这个循环中,您可以逐块读取文件,更新校验和,并定期打印出进度报告。在
m.update(f.read())
您可以反复调用update()方法并将文件分块提供给它。这样,你就可以自己展示进度了。在
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)这就是我得到的:
print digest_with_progress('/bin/bash', 1024)
下面是这个文件的实际细节。在
$ 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块,这就是您看到的。在
chunk_size
/bin/bash
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。在
f.read(N_BYTES)
m.update
md5.hexdigest
好吧,不是
hedxigest()
调用需要一段时间,而是读取文件。在记住这一点,将
m.update(f.read())
替换为一个循环,在这个循环中,您可以逐块读取文件,更新校验和,并定期打印出进度报告。在您可以反复调用
update()
方法并将文件分块提供给它。这样,你就可以自己展示进度了。在当我尝试
^{pr2}$print digest_with_progress('/bin/bash', 1024)
这就是我得到的:下面是这个文件的实际细节。在
请注意,如果将
chunk_size
设得太大,则无法获得预期的输出。例如,如果我们读入100kb的块而不是/bin/bash
的1kb块,这就是您看到的。在这种方法的局限性在于,我们只有在将块读入摘要之后才能计算进度。因此,如果块大小太大,每次读取块并更新摘要时,进行中的百分比差异将超过1%。更大的块大小会使工作更快完成。因此,为了提高效率,您可能需要放宽每个百分比的打印完成百分比的条件。在
您应该使用
f.read(N_BYTES)
分块读取文件,跟踪文件中的距离,并将这些块传递给m.update
。这是昂贵的操作,而不是md5.hexdigest
。在相关问题 更多 >
编程相关推荐