当我们在使用电脑时,常常会遇到磁盘空间不足的问题。其中一个重要原因是大量的重复文件占据了磁盘空间。这些重复文件可能是无意中下载的多个版本文件,或者是软件安装过程中产生的重复备份。手动查找和删除这些重复文件不仅耗时耗力,还容易遗漏。而使用 Python 编写的文件去重脚本,可以高效地解决这个问题。
代码原理
该代码通过计算文件的 MD5 哈希值来判断文件是否重复。首先,它会遍历指定的驱动器中的所有文件,按文件大小进行分组。然后对大小相同的文件计算 MD5 哈希值,如果两个文件的哈希值相同,则认为它们是重复文件。
代码的核心功能如下:
计算文件的 MD5 哈希值
通过 hashlib
库计算文件的 MD5 哈希值,这是一种常用的文件内容标识方法。
python
def get_file_hash(file_path, block_size=65536):
"""计算文件的MD5哈希值"""
hasher = hashlib.md5()
try:
with open(file_path, 'rb') as f:
buf = f.read(block_size)
while len(buf) > 0:
hasher.update(buf)
buf = f.read(block_size)
return hasher.hexdigest()
except (PermissionError, FileNotFoundError, OSError):
# 如果无法访问文件,返回None
return None
查找重复文件
遍历指定的驱动器,按文件大小分组。只对大小相同的文件计算哈希值,以减少计算量。最后将哈希值相同的文件视为重复文件。
python
def find_duplicate_files(drives):
"""查找重复文件"""
print("开始扫描磁盘中的文件...")
# 先按文件大小分组,减少哈希计算次数
size_dict = defaultdict(list)
total_files = 0
# 遍历所有指定的驱动器
for drive in drives:
for root, _, files in os.walk(drive):
for filename in files:
file_path = os.path.join(root, filename)
try:
file_size = os.path.getsize(file_path)
size_dict[file_size].append(file_path)
total_files += 1
if total_files % 1000 == 0:
print(f"已扫描 {total_files} 个文件...")
except (OSError, PermissionError):
continue
print(f"文件扫描完成,共扫描 {total_files} 个文件。")
print("开始计算文件哈希值以查找重复...")
# 对于大小相同的文件,计算哈希值
hash_dict = defaultdict(list)
potential_duplicates = 0
for size, file_list in size_dict.items():
if len(file_list) > 1: # 只处理大小相同的文件
potential_duplicates += len(file_list)
for file_path in file_list:
file_hash = get_file_hash(file_path)
if file_hash: # 如果成功计算了哈希值
hash_dict[file_hash].append(file_path)
print(f"哈希值计算完成,处理了 {potential_duplicates} 个潜在重复文件。")
# 找出重复文件(哈希值相同的文件)
duplicates = {hash_val: paths for hash_val, paths in hash_dict.items() if len(paths) > 1}
return duplicates
输出结果
将查找到的重复文件信息输出到指定的文件中。这有助于我们查看和管理重复文件。
python
# 将结果写入文件
with open(args.output, 'w', encoding='utf-8') as f:
f.write(f"重复文件报告 - 生成时间: {time.strftime('%Y-%m-%d %H:%M:%S')}\n")
f.write(f"扫描的驱动器: {', '.join(args.drives)}\n\n")
if not duplicate_files:
f.write("未找到重复文件。\n")
else:
duplicate_groups = 0
total_duplicates = 0
for hash_val, file_paths in duplicate_files.items():
duplicate_groups += 1
total_duplicates += len(file_paths)
f.write(f"重复组 #{duplicate_groups} (MD5: {hash_val}):\n")
for path in file_paths:
f.write(f" {path}\n")
f.write("\n")
f.write(f"总结: 发现 {duplicate_groups} 组重复文件,共 {total_duplicates} 个文件。\n")
f.write(f"扫描用时: {time.time() - start_time:.2f} 秒\n")
使用方法
-
安装依赖库 :确保你的 Python 环境中安装了
os
和hashlib
库。如果没有安装,可以通过pip install
安装。 -
运行脚本:在命令行中运行脚本,指定要扫描的驱动器和输出文件名。
bash
python duplicate_file_finder.py --drives E:/ --output duplicate_files_report.txt
- 查看结果:扫描完成后,会在指定的输出文件中生成重复文件的报告。根据报告中的信息,可以手动删除不需要的重复文件。
注意事项
- 备份重要文件:在删除重复文件之前,建议先备份重要文件,以免误删。
- 权限问题:如果某些文件由于权限问题无法访问,脚本会自动跳过这些文件。
- 性能问题:如果磁盘中的文件数量非常多,扫描和计算哈希值可能会需要较长时间。
通过这个脚本,你可以轻松地找到磁盘中的重复文件,并释放宝贵的存储空间。如果你对这段代码有疑问或需要进一步优化,欢迎随时在下方评论区留言交流。