如何实现打印目录中内容完全相同的文件?Python代码咨询
找出目录中内容重复的文件
嘿,你的思路方向完全没问题——用MD5哈希值来判断文件内容是否一致是个非常靠谱的办法!不过原代码里有几个小细节可以调整,我帮你完善一下,还加了些实用的优化点:
原代码的几个小问题
- 把
check和match_check函数放在循环内部,每次循环都会重新定义函数,完全没必要,挪到循环外面更高效。 - 直接用
open(data).read()读取整个文件,如果遇到大文件会占用大量内存,分块读取更稳妥。 os.listdir()返回的只是文件名,不是完整路径,如果你的工作目录不是目标目录,打开文件会报错,得用完整路径。- 代码没写完,缺少最终的判断和打印逻辑。
完善后的完整代码
import os import itertools import hashlib def calculate_file_hash(file_path, chunk_size=4096): """分块计算文件的MD5哈希值,避免大文件占用过多内存""" md5_hash = hashlib.md5() with open(file_path, 'rb') as f: # 分块读取文件内容 while chunk := f.read(chunk_size): md5_hash.update(chunk) return md5_hash.hexdigest() def find_duplicate_files(target_dir): # 获取目录下所有文件的完整路径(跳过子目录,只处理文件) file_paths = [os.path.join(target_dir, filename) for filename in os.listdir(target_dir) if os.path.isfile(os.path.join(target_dir, filename))] # 遍历所有两两组合的文件对 for file1, file2 in itertools.combinations(file_paths, 2): # 先判断文件大小,大小不同直接跳过,减少哈希计算次数 if os.path.getsize(file1) != os.path.getsize(file2): continue # 计算哈希并比对 if calculate_file_hash(file1) == calculate_file_hash(file2): print(f"内容重复的文件:{file1} 和 {file2}") if __name__ == "__main__": target_directory = input("请输入目标目录路径:") if os.path.isdir(target_directory): find_duplicate_files(target_directory) else: print("输入的路径不是有效的目录!")
代码说明
calculate_file_hash函数:分块读取文件计算MD5,默认每次读4096字节,既保证效率又不会占用太多内存,同时用with语句自动管理文件句柄,更安全。- 增加了文件大小预判断:如果两个文件大小不一样,内容肯定不同,直接跳过哈希计算,能大幅提升处理大量文件时的速度。
- 只处理目录下的文件,自动跳过子目录,避免报错。
- 增加了目录有效性检查,防止用户输入错误路径。
额外优化建议
如果目录里文件特别多,用itertools.combinations两两比对的效率会比较低,你可以先把所有文件按哈希值分组,这样能一次性找出所有重复的文件:
def find_duplicates_faster(target_dir): file_hash_map = {} file_paths = [os.path.join(target_dir, filename) for filename in os.listdir(target_dir) if os.path.isfile(os.path.join(target_dir, filename))] for file_path in file_paths: file_size = os.path.getsize(file_path) # 先按大小分组,再计算哈希 if file_size not in file_hash_map: file_hash_map[file_size] = {} file_hash = calculate_file_hash(file_path) if file_hash not in file_hash_map[file_size]: file_hash_map[file_size][file_hash] = [] file_hash_map[file_size][file_hash].append(file_path) # 输出所有重复的文件组 for size_group in file_hash_map.values(): for hash_group in size_group.values(): if len(hash_group) > 1: print(f"内容重复的文件组:") for file in hash_group: print(f" - {file}")
这个方法的效率更高,适合处理数百甚至上千个文件的场景。
内容的提问来源于stack exchange,提问作者Andrew S Thompson
相关产品推荐
相关产品推荐

