如何根据文件名列表批量重命名文件及os.rename报错排查
故障原因
- 路径拼接错误:
os.listdir(directory)仅返回目标文件夹下的文件名,不包含文件夹路径,直接调用os.rename(old_filename, new_filenames[index])时,系统会在Python脚本当前运行的工作目录下查找0001.jpg,而非你指定的Folder目录,自然找不到目标文件,这是触发FileNotFoundError的核心原因。 - 未保留文件后缀:原文件是
.jpg格式,你的新文件名没有携带对应后缀,就算路径正确,重命名后文件会变成无后缀格式,无法正常打开。 - 隐藏逻辑风险:
os.listdir默认返回的文件顺序不保证和0001、0002的数字序号一致,直接按遍历索引匹配新文件名,很容易出现文件和新名称对错位的问题。 - 语法格式错误:原代码中
os.rename行多了一层缩进,不符合Python缩进规则,运行时会先触发语法错误。
修正后可直接运行的代码
import os # 配置项:替换为你的图片文件夹路径、完整新文件名列表 target_folder = "Folder" new_filenames = ["Filename1", "Filename2", "Filename3"] # 补全全部30个对应新名称 # 过滤出文件夹内的所有文件(排除子文件夹),并按原文件名的数字序号排序,保证顺序匹配0001/0002规则 file_list = [f for f in os.listdir(target_folder) if os.path.isfile(os.path.join(target_folder, f))] file_list.sort(key=lambda x: int(x.split(".")[0])) # 提前校验数量,避免索引越界 if len(file_list) != len(new_filenames): raise ValueError(f"数量不匹配:文件夹内共有{len(file_list)}个文件,新文件名列表共{len(new_filenames)}个,请检查") # 遍历执行重命名 for index, old_name in enumerate(file_list): # 自动提取原文件后缀 _, suffix = os.path.splitext(old_name) # 拼接完整的新旧文件路径 old_full_path = os.path.join(target_folder, old_name) new_full_path = os.path.join(target_folder, f"{new_filenames[index]}{suffix}") os.rename(old_full_path, new_full_path) print("批量重命名执行完成")
注意事项
- 如果
Folder文件夹不在脚本同级目录,将target_folder替换为文件夹绝对路径即可,Windows系统路径建议用正斜杠,例如"C:/Users/xxx/Pictures/我的图片集"。 - 运行前确认
new_filenames列表的顺序和你需要的0001到0030的对应关系完全一致,避免命名错位。
内容的提问来源于stack exchange,提问作者brutusbombocloth
相关产品推荐
相关产品推荐

