下面是详细的“Python实现MD5进行文件去重的示例代码”的攻略。
1. 原理简介
MD5(Message-Digest Algorithm 5,信息-摘要算法5)是一种常用的哈希散列函数,它可以将任意长度的消息映射为一个固定长度的消息摘要(通常为128位),并且在不同的消息输入情况下得到的输出值具有很高的随机性,互不相同。因此,在文件去重的场景中,可以根据文件的MD5值来判断两个文件是否相同。
2. 实现步骤
针对文件去重的需求,我们可以按照以下步骤来实现:
- 遍历指定文件夹中的所有文件,计算每个文件的MD5值;
- 将MD5值与已经计算过的MD5值进行比对,如果存在相同的MD5值,则说明这两个文件相同,可以将其中一个文件删除;
- 如果不存在相同的MD5值,则将该MD5值添加到已计算过的MD5值列表中。
下面我们来看代码实现。
3. 代码实现
import os
import hashlib
def get_md5(filename):
"""
计算指定文件的MD5值
"""
m = hashlib.md5()
with open(filename, 'rb') as f:
while True:
data = f.read(1024 * 1024)
if not data:
break
m.update(data)
return m.hexdigest()
def find_duplicate_files(folder):
"""
查找文件夹中的重复文件,并返回重复文件列表
"""
md5_dict = {}
duplicate_files = []
for root, dirs, files in os.walk(folder):
for filename in files:
filepath = os.path.join(root, filename)
file_md5 = get_md5(filepath)
if file_md5 in md5_dict:
duplicate_files.append(filepath)
else:
md5_dict[file_md5] = filepath
return duplicate_files
if __name__ == '__main__':
folder = '/path/to/your/folder'
duplicate_files = find_duplicate_files(folder)
if duplicate_files:
print("The following files are duplicates:")
for file in duplicate_files:
print(file)
# 删除文件的代码放在这里
else:
print("No duplicate files found.")
代码分析:
get_md5()
函数接收一个文件名参数,计算该文件的MD5值,并返回 MD5 值的十六进制形式。find_duplicate_files()
函数接收一个文件夹名参数,遍历该文件夹(包括子文件夹)中的所有文件,计算每个文件的 MD5 值,将其存储在字典md5_dict
中,键为 MD5 值,值为该文件的路径。遍历过程中,如果发现 MD5 值已经存在于md5_dict
中,说明该文件是重复的,将其路径添加到duplicate_files
列表中。最后,将duplicate_files
列表返回。- 如果运行代码时检测到重复文件,将依次输出重复文件的路径,并在输出后添加代码用于删除文件。
4. 示例说明
示例1
假设我们有如下文件夹结构:
test-folder/
|--a.txt
|--b.txt
|--c.txt
|--sub-folder/
|--a.txt
其中,a.txt
和 sub-folder/a.txt
的内容完全相同。
运行上述代码后,输出如下内容:
The following files are duplicates:
/path/to/your/folder/a.txt
/path/to/your/folder/sub-folder/a.txt
代码便根据两个文件的MD5值进行匹配,然后输出所有的重复文件路径。如果需要删除这些文件,只需要在输出重复文件路径的代码后添加删除文件的代码即可。
示例2
如果我们希望将文件夹中的所有重复文件都删除,可以修改代码中的一行:
if duplicate_files:
print("The following files are duplicates:")
for file in duplicate_files:
print(file)
# 删除文件的代码放在这里
将其中的注释改为删除文件的代码即可:
if duplicate_files:
print("The following files are duplicates:")
for file in duplicate_files:
print(file)
os.remove(file)
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现MD5进行文件去重的示例代码 - Python技术站