以文件 MD5 作为文件名(保留扩展名),递归处理子文件夹,
并生成一个 md5_rename_map.csv 记录原始文件名与改后文件名及MD5。

import os
import csv
import hashlib
from pathlib import Path

# ======== 可修改配置 ========
ROOT_DIR = Path(r"C:\test\md")  # 要处理的目录
OUTPUT_CSV = ROOT_DIR / "md5_rename_map1025.csv"    # 输出映射表路径
DRY_RUN = False  # True 仅预览不执行重命名
# ===========================


def md5_of_file(file_path, chunk_size=8192):
    """计算文件 MD5"""
    md5 = hashlib.md5()
    with open(file_path, "rb") as f:
        while chunk := f.read(chunk_size):
            md5.update(chunk)
    return md5.hexdigest()


def rename_file_to_md5(file_path: Path, writer):
    """重命名单个文件为md5,并写入CSV"""
    try:
        md5_val = md5_of_file(file_path)
        new_name = f"{md5_val}{file_path.suffix.lower()}"
        new_path = file_path.with_name(new_name)

        if new_path == file_path:
            # 已经是 md5 命名
            return

        if new_path.exists():
            print(f"⚠️ 已存在相同MD5文件,跳过:{file_path}")
            return

        if DRY_RUN:
            print(f"[DRY] {file_path} -> {new_path}")
        else:
            file_path.rename(new_path)
            print(f"✅ {file_path} -> {new_path}")

        # 写入映射表
        writer.writerow([str(file_path), str(new_path), md5_val])

    except Exception as e:
        print(f"❌ {file_path} 计算或重命名失败:{e}")


def main():
    with open(OUTPUT_CSV, "w", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerow(["original_path", "new_path", "md5"])

        for file in ROOT_DIR.rglob("*"):
            if file.is_file():
                rename_file_to_md5(file, writer)

    print(f"\n📄 映射表已生成:{OUTPUT_CSV}")


if __name__ == "__main__":
    main()
❤️ 转载文章请注明出处,谢谢!❤️