python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python hashlib获取文件md5值

Python的hashlib库获取超大文件的md5值实例探究

作者:weibin python学习与大数据分析

这篇文章主要为大家介绍了Python的hashlib库获取超大文件的md5值实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Python hashlib获取文件md5值

不知道大家在工作中有没有涉及到超大文件的读取,在处理超大文件时,如果直接将整个文件读到内存,然后再计算MD5值可能会占用大量内存,严重的情况下可能会导致系统故障。

为了减轻系统内存压力,我们通常采取分块读取文件内容的方式来计算MD5。

Python的hashlib库,它支持将大文件分块读取并计算MD5值,从而避免一次性加载整个文件到内存中。

import hashlib
import os
def get_file_md5(file_path, block_size=2 ** 20):  # 默认块大小为1MB
    md5_hash = hashlib.md5()
    with open(file_path, "rb") as f:
        while True:
            data = f.read(block_size)
            if not data:
                break
            md5_hash.update(data)
    return md5_hash.hexdigest()
# 使用方法
file_path_large_file = r"E:\xxxxxxx\Win10_64位专业版本.ISO"
md5_value = get_file_md5(file_path_large_file)
print(f"大文件的大小是:{os.path.getsize(file_path_large_file)/1024/1024/1024:.2f}GB")
print(f"大文件的MD5值是:{md5_value}") 

测试5.42G操作系统文件

我自己找了一个5.42G操作系统文件来测试了下,运行过程计算机内存的使用率并没有明显增加,表现很平稳。

内存利用率变化

可能大家看到这里不能明显感受到分块读取文件和一次性将大文件读入内存的差异,我下面的函数去掉了分块读取的设置,我们再来看下内存利用率的变化

def get_file_md52(file_path):  # 这里去掉了块大小的设置
    md5_hash = hashlib.md5()
    with open(file_path, "rb") as f:
        while True:
            data = f.read()  # 这里是一次性将文件读入内存
            if not data:
                break
            md5_hash.update(data)
    return md5_hash.hexdigest()
# 使用方法
file_path_large_file = r"E:\xxxxxx\Win10_64位专业版本.ISO"
md5_value = get_file_md52(file_path_large_file)
print(f"大文件的大小是:{os.path.getsize(file_path_large_file)/1024/1024/1024:.2f}GB")
print(f"大文件的MD5值是:{md5_value}")

通过上面的内存利用率截图,我们可以看到如果不设置分块读取,内存利用率会明显升高,在工作中这种操作会存在较大风险,所以,各位同学应该尽量避免这种操作方式。

当然了,分块读取超大文件的操作,不仅适用于计算md5值,同样可以用在其他读取文件内容的场景。希望各位同学可以灵活使用。

以上就是Python的hashlib库获取超大文件的md5值实例探究的详细内容,更多关于Python hashlib获取文件md5值的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文