本系列文章配套代码获取有以下两种途径:
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1i9F6oV1J5oZnIsOASDs0gQ?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Python_mini_program
脚本需求:
实现步骤:
-
使用hashlib模块计算文件的MD5哈希值。 -
使用os模块遍历指定目录及其所有子目录,对每个文件计算哈希值。 -
使用一个字典来存储哈希值及其对应的文件路径,以检测重复。 -
如果发现具有相同哈希值的文件(即重复文件),则将它们记录下来。 -
在遍历完成后,删除所有记录的重复文件,并打印出已删除的文件路径。
代码实现:
-
file_hash函数用于计算文件的MD5哈希值; -
find_and_delete_duplicates函数用于在指定目录下查找并删除重复文件。
具体代码如下所示:
# 导入os模块,用于文件和目录操作
import os
# 导入hashlib模块,用于计算哈希值
import hashlib
def file_hash(filepath):
"""计算文件的MD5哈希值"""
# 创建一个md5哈希对象
hash_md5 = hashlib.md5()
# 以二进制读模式打开文件
with open(filepath, "rb") as f:
# 使用iter函数和lambda表达式迭代读取文件,每次读取4096字节,直到文件结束
for chunk in iter(lambda: f.read(4096), b""):
# 更新哈希对象
hash_md5.update(chunk)
# 返回计算得到的哈希值的十六进制字符串表示
return hash_md5.hexdigest()
def find_and_delete_duplicates(root_dir):
"""在指定目录下查找并删除重复文件"""
# 创建一个字典,用于存储文件的哈希值及其对应的文件路径
hashes = {}
# 创建一个列表,用于存储重复文件的路径
duplicates = []
# 使用os.walk遍历指定目录及其所有子目录
for dirpath, _, filenames in os.walk(root_dir):
# 遍历当前目录下的所有文件名
for filename in filenames:
# 构建文件的完整路径
filepath = os.path.join(dirpath, filename)
# 计算当前文件的哈希值
file_hash_value = file_hash(filepath)
# 检查哈希值是否已存在于字典中
if file_hash_value in hashes:
# 如果存在,说明是重复文件,将其路径添加到重复文件列表中
duplicates.append(filepath)
else:
# 如果不存在,将哈希值及其对应的文件路径添加到字典中
hashes[file_hash_value] = filepath
# 遍历重复文件列表,删除每个重复文件
for dup in duplicates:
# 删除文件
os.remove(dup)
# 打印已删除的文件路径
print(f"Deleted duplicate file: {dup}")
# 使用示例
# 指定要查找重复文件的根目录路径
root_directory = "./files" # 替换为你的目录路径
# 调用函数查找并删除重复文件
find_and_delete_duplicates(root_directory)
本篇文章来源于微信公众号: 码农设计师