Python os.rename批量重命名文件触发FileNotFoundError报错排查
报错原因
- 核心问题是循环逻辑错误:你写了双层嵌套循环,外层每遍历到一个新文件名,内层就会遍历fake文件夹下的所有文件执行重命名。也就是说外层第一次循环拿到第一个org里的文件名时,就会尝试把fake里所有文件都重命名移动到nw文件夹,等第一次内层循环跑完,fake文件夹里的原文件已经全被移走了,后续循环再访问fake路径下的原文件,自然会提示找不到文件。
- 第二个触发点是目标nw文件夹如果没有提前手动创建,跨文件夹执行
os.rename时,系统找不到目标路径也会抛出同类错误。 - 额外隐患:
os.listdir返回的文件列表默认是无序的,就算你改对了循环结构,不做排序直接按顺序配对,也会出现文件名和图片内容对应错乱的问题。
修复方法
不要用嵌套循环,先对两个文件夹的文件列表做统一排序,按位置一一配对重命名,同时提前创建目标文件夹,修复后的代码如下:
import os # 配置三个文件夹的路径 new_path = 'C:/Python310/py_scripts/new' fake_path = 'C:/Python310/py_scripts/fake' nw_path = 'C:/Python310/py_scripts/nw' # 提前创建目标输出文件夹,文件夹已存在时不会报错 os.makedirs(nw_path, exist_ok=True) # 读取文件名列表,统一后缀为小写.png,过滤非png文件,同时排序保证对应顺序一致 new_name_list = sorted([ f.replace('.PNG', '.png') for f in os.listdir(new_path) if f.lower().endswith('.png') ]) fake_file_list = sorted([ f for f in os.listdir(fake_path) if f.lower().endswith('.png') ]) # 提前校验文件数量,避免数量不匹配导致错位 if len(new_name_list) != len(fake_file_list): raise Exception(f"文件数量不匹配:new文件夹png数量为{len(new_name_list)},fake文件夹png数量为{len(fake_file_list)}") # 一一对应执行重命名移动 for fake_file, target_name in zip(fake_file_list, new_name_list): old_full_path = os.path.join(fake_path, fake_file) new_full_path = os.path.join(nw_path, target_name) os.rename(old_full_path, new_full_path)
代码说明:
- 加了png后缀过滤,避免把文件夹里的隐藏缓存文件、其他格式文件纳入配对
- 用
sorted()对两个列表做相同规则的排序,保证文件配对顺序符合预期,不会乱序错配 - 用
zip()按索引配对两个列表的对应项,单次循环处理一组文件,完全避免嵌套循环导致的重复移动、文件找不到问题 - 用
os.path.join拼接路径,比手动写f字符串拼接兼容性更好,不会出现斜杠格式错误
内容的提问来源于stack exchange,提问作者TheNerdy97
相关产品推荐
相关产品推荐

