Python如何使用file_size与checksum组合作为字典键映射filename检测重复文件
核心实现逻辑
Python字典支持所有*可哈希(不可变)*的对象作为键,整数类型的文件大小、字符串类型的校验和均为可哈希类型,将二者打包为元组即可作为合法的组合键直接使用。
你之前尝试失败大概率是误用了列表(方括号包裹)作为键,列表为可变对象不支持哈希,会触发TypeError: unhashable type: 'list'报错,替换为小括号包裹的元组即可解决。
完整代码示例
import os import hashlib # 计算文件MD5校验和,大文件可分块读取避免内存占用过高 def get_file_md5(file_path, block_size=65536): md5 = hashlib.md5() with open(file_path, 'rb') as f: for chunk in iter(lambda: f.read(block_size), b''): md5.update(chunk) return md5.hexdigest() # 初始化存储组合键的字典 file_record = {} # 示例:遍历指定目录下所有文件 scan_dir = "/your/target/directory/path" for root, _, files in os.walk(scan_dir): for file_name in files: full_path = os.path.join(root, file_name) # 跳过软链接等特殊文件,按需调整 if not os.path.isfile(full_path): continue # 第一步先取文件大小,大小不同直接判定为不重复,无需计算哈希提升效率 file_size = os.path.getsize(full_path) # 第二步计算文件校验和 file_md5 = get_file_md5(full_path) # 构造组合键 combined_key = (file_size, file_md5) if combined_key in file_record: print(f"重复文件:{full_path} <=> {file_record[combined_key]}") else: file_record[combined_key] = full_path
补充说明
- 校验和算法可按需替换为SHA1、SHA256等,仅需修改
hashlib调用的对应方法即可 - 对性能要求较高的场景,可以先只以文件大小为键分组,仅对同大小的文件计算校验和做二次判断,可大幅减少哈希计算的开销
内容的提问来源于stack exchange,提问作者Clayton
相关产品推荐
相关产品推荐

