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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:57:21