嵌套文件夹名称缩短问题及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
相关产品推荐
相关产品推荐

