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

嵌套文件夹名称缩短问题及Python脚本故障排查

问题分析与解决方案

核心问题

你的Python脚本执行一次重命名后就终止,根源是os.walk默认的自上而下遍历逻辑:

  • os.walk会先读取当前目录下的所有子文件夹名存入dirnames列表
  • 当你重命名了某个子文件夹后,后续遍历深层目录时,原来的路径已经失效,os.walk无法找到对应的文件夹,导致遍历提前终止

另外原代码还有两个潜在问题:

  • 未处理同名冲突:如果两个长文件夹缩短后名称相同,os.rename会直接报错
  • 文件写入的换行符不规范,会导致记录格式混乱

修正后的代码

import os

def shorten_folder_names(root_folder, max_length):
    # 先收集所有重命名记录,最后统一写入文件
    rename_records = []
    
    # 自下而上遍历目录:先处理最深层子文件夹,再处理上层
    for dirpath, dirnames, filenames in os.walk(root_folder, topdown=False):
        for dirname in dirnames:
            old_path = os.path.join(dirpath, dirname)
            # 跳过已符合长度要求的文件夹
            if len(dirname) <= max_length:
                continue
            
            base_new_name = dirname[:max_length]
            new_path = os.path.join(dirpath, base_new_name)
            # 处理同名冲突:如果新名称已存在,添加数字后缀
            suffix = 1
            while os.path.exists(new_path):
                new_name = f"{base_new_name}_{suffix}"
                new_path = os.path.join(dirpath, new_name)
                suffix += 1
            
            # 执行重命名
            os.rename(old_path, new_path)
            rename_records.append(f"{old_path} -> {new_path}")
    
    # 写入重命名记录到文件
    with open("folder_names.csv", "w", encoding="utf-8") as file:
        file.write("\n".join(rename_records))

关键改进点

  • 使用topdown=False参数,让os.walk从最深层目录开始处理,即使上层文件夹改名,也不会影响已完成的深层遍历
  • 添加同名冲突处理逻辑,避免重命名失败
  • 先收集所有重命名记录,最后一次性写入文件,提升效率同时避免IO错误
  • 指定文件编码为utf-8,避免中文路径出现乱码

内容的提问来源于stack exchange,提问作者Colin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:05:02