获取某个目录及其子目录下所有文件的MD5值,主要分为2个步骤:
- 获取目录下所有的文件名称(全路径)
- 计算每一个文件的MD5值
获取目录下所有的文件名称
- 需要用到 os 模块
os.walk 是一个 Python 中用于遍历目录树的方法
它可以递归地遍历指定目录及其子目录中的所有文件和文件夹。
os.walk 方法的基本语法如下:
for root, dirs, files in os.walk(directory):
# root 当前遍历的目录路径
# dirs 当前目录下的子目录列表
# files 当前目录下的文件列表
# 在这里处理文件或目录
在每次迭代中,os.walk 返回三个值:root、dirs 和 files。其中:
root 是当前遍历的目录路径
dirs 是一个字符串列表,包含了当前目录下的子目录名
files 是一个字符串列表,包含了当前目录下的文件名
计算每一个文件的MD5值
- 需要用到 hashlib 模块
hashlib 是 Python 中的一个内置模块,用于提供常见的哈希函数功能
它通过提供一组接口来支持各种哈希算法,如 MD5、SHA1、SHA256 等
hashlib.md5() 创建了 MD5 对象
update() 方法向对象添加要计算哈希值的数据
hexdigest() 方法获取哈希值的十六进制表示
具体的代码实现:
# -*- coding: utf-8 -*-
import hashlib
import os
def get_files(path):
"""
遍历指定路径下的所有文件
:param path: 指定路径
:return: 文件全名称(含路径)列表
"""
files = []
for root, directories, filenames in os.walk(path):
# 将所有的文件逐一加到列表中
for filename in filenames:
files.append(os.path.join(root, filename))
return files
def get_file_md5(file_name):
"""
计算文件的md5
:param file_name: 入参为文件路径
:return: 返回MD5 值的十六进制字符串
"""
m = hashlib.md5() # 创建md5对象
with open(file_name, 'rb') as fobj:
# 对文件进行分块读取,以避免一次性将整个文件读入内存,每次读取 4096 字节
for chunk in iter(lambda: file.read(4096), b''):
m.update(chunk) # 更新md5对象
return m.hexdigest() # 返回md5对象
# 目录路径,如C:\Users\Desktop'
dir_path = r'...'
# 获取文件列表
files = get_files(dir_path)
# 计算每一个文件的MD5值
for file in files:
md5_info = get_file_md5(file)
# 输出文件的上一级目录 和 文件名称
print(file.split('\\')[-2] + '\\' +file.split('\\')[-1])
# 输出文件的MD5值,并换行
print(md5_info,'\n')