You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:45:07