基于字典键值批量移动文件至对应目录报错求助
问题:按字典标签批量移动图片时遇重复文件报错
我是新手,尝试根据字典的键(标签),把源目录里的图片移到对应名称的目标目录。字典结构如下:
字典示例
print(multivalue_dict) defaultdict(list,{ 'cat_a': ['55b85ea15a1536d46b7190ad6fff8ce7.jpg', 'd4684dcdc759dd9cdf41504698d737d8.jpg', '6325b6870c54cd47be6ebfbffa620ec7.jpg'], 'cat_b': ['55b85ea15a1536d46b7190ad6fff8ce7.jpg', 'd4684dcdc759dd9cdf41504698d737d8.jpg', '6325b6870c54cd47be6ebfbffa620ec7.jpg'], # 更多标签... })
预期每个标签对应目录存放列表内的所有图片,我用os和shutil写了代码,但运行报错,只能移动1张图就停止。
我的代码
import os import shutil source_dir = "/Users/Me/Downloads/File/Images" for key in multivalue_dict: target_dir = f"/Users/Me/Downloads/File/{key}" for file in multivalue_dict[key]: shutil.move(os.path.join(source_dir, file_name), target_dir)
错误信息
Error Traceback (most recent call last) /var/folders/gs/0bx6d0ms3jxfgjd6vfkz22l40000gn/T/ipykernel_29606/1312100907.py in 7 if os.path.exists(file): 8 pass ----> 9 shutil.move(os.path.join(source_dir, file_name), target_dir) /Users/anaconda3/lib/python3.9/shutil.py in move(src, dst, copy_function) 821 822 if os.path.exists(real_dst): --> 823 raise Error("Destination path '%s' already exists" % real_dst) 824 try: 825 os.rename(src, real_dst) Error: Destination path '/Users/Me/Downloads/File/cat_a/f54d0c5cbd8e2270742293edf9075cb1.jpg' already exists
问题分析与解决
核心问题
- 变量名错误:循环变量是
file,但移动时写了file_name,属于未定义变量(你报错里有具体文件名,可能是笔误,但主要问题是下面两点) - 重复文件冲突:同一个文件出现在多个标签的列表中,第一次移动后源文件已被移走,或者目标目录已有该文件,导致
shutil.move报错 - 目标目录未预创建:如果目标目录不存在,部分系统下
shutil.move会失败
修正代码
import os import shutil source_dir = "/Users/Me/Downloads/File/Images" for key in multivalue_dict: target_dir = f"/Users/Me/Downloads/File/{key}" # 确保目标目录存在,已存在则不报错 os.makedirs(target_dir, exist_ok=True) for file in multivalue_dict[key]: src_path = os.path.join(source_dir, file) dst_path = os.path.join(target_dir, file) # 先检查源文件是否还存在(避免处理已被移走的文件) if not os.path.exists(src_path): print(f"跳过:源文件 {file} 不存在") continue # 处理目标文件已存在的情况:自动重命名 if os.path.exists(dst_path): name, ext = os.path.splitext(file) counter = 1 # 循环找可用的文件名 while os.path.exists(os.path.join(target_dir, f"{name}_{counter}{ext}")): counter += 1 dst_path = os.path.join(target_dir, f"{name}_{counter}{ext}") # 执行移动 shutil.move(src_path, dst_path)
关键改进
- 用
os.makedirs(target_dir, exist_ok=True)自动创建目标目录 - 修正变量名,确保路径拼接正确
- 增加源文件存在性检查,跳过已被移动的文件
- 对目标目录已存在的文件,自动添加数字后缀重命名,避免冲突
内容的提问来源于stack exchange,提问作者Jean Eudes des Graviers
相关产品推荐
相关产品推荐

