基于CSV的Image_Name与Complexity用Python创建子文件夹并迁移图片
问题:按CSV标签批量迁移图片到对应子目录
需求说明
需要根据DF.csv中的Complexity标签,将Images文件夹下的所有图片分类迁移到Subfolder下的Basic、Moderate、Complex子目录中。
当前文件夹结构
- Folder
- Images(存放所有待分类图片)
- DF.csv(包含图片名称与对应分类标签)
目标文件夹结构
- Subfolder
- Basic
- Moderate
- Complex
CSV数据示例
| index | Title | Ingredients | Image_Name | Ingredient Count | Complexity |
|---|---|---|---|---|---|
| 1 | 香酥盐椒土豆 | ['2个大蛋白', '1磅新土豆(直径约1英寸)', '2茶匙粗盐', '¾茶匙现磨黑胡椒', '1茶匙切碎迷迭香', '1茶匙切碎百里香', '1茶匙切碎欧芹'] | crispy-salt-and-pepper-potatoes-dan-kluger | 6 | Basic |
| 2 | 感恩节芝士通心粉 | ['1杯淡奶', '1杯全脂牛奶', '1茶匙大蒜粉', '1茶匙洋葱粉', '1茶匙烟熏甜椒粉', '½茶匙现磨黑胡椒', '1茶匙粗盐(额外备用)', '2磅特浓切达干酪(粗磨)', '4盎司全脂奶油奶酪', '1磅通心粉'] | thanksgiving-mac-and-cheese-erick-williams | 11 | Moderate |
| 3 | 意大利香肠面包馅料 | ['1个(¾-1磅)圆形意大利面包(切1英寸方块,共8杯)', '2汤匙橄榄油(分份)', '2磅甜意大利香肠(去肠衣,分份)', '1条无盐黄油(切块)', '3个中等大小洋葱(切碎)', '4根西芹(切碎)', '5瓣大蒜(切末)', '4个大鸡蛋(打散)', '¾杯浓奶油(分份)', '½杯火鸡杂汤或低钠鸡汤', '1杯帕玛森芝士碎(2盎司)', '½杯切碎意大利欧芹', '1个4夸脱浅口陶瓷/玻璃烤碗'] | italian-sausage-and-bread-stuffing-240559 | 22 | Complex |
初始代码
import pandas as pd df = pd.read_csv("DF.csv") df.head()
解决方案
以下是完整的实现代码,包含自动创建目录、多格式图片匹配、异常跳过等功能,确保迁移过程稳定可靠:
import pandas as pd import os import shutil # 配置核心路径 base_dir = os.getcwd() # 默认当前工作目录为Folder所在路径,可手动修改 images_source = os.path.join(base_dir, "Images") target_root = os.path.join(base_dir, "Subfolder") csv_file = os.path.join(base_dir, "DF.csv") # 1. 读取CSV数据 df = pd.read_csv(csv_file) # 2. 预创建目标分类目录 target_folders = ["Basic", "Moderate", "Complex"] for folder in target_folders: folder_path = os.path.join(target_root, folder) os.makedirs(folder_path, exist_ok=True) # 自动跳过已存在的目录 # 3. 遍历CSV记录,执行图片迁移 # 支持的图片扩展名,可根据实际情况补充 image_exts = [".jpg", ".jpeg", ".png", ".webp", ".gif"] for _, row in df.iterrows(): img_name = row["Image_Name"] category = row["Complexity"] # 查找对应图片的实际路径(匹配扩展名) source_path = None for ext in image_exts: candidate = os.path.join(images_source, f"{img_name}{ext}") if os.path.exists(candidate): source_path = candidate break if not source_path: print(f"⚠️ 未找到图片文件:{img_name},跳过迁移") continue # 构建目标路径 target_folder = os.path.join(target_root, category) target_path = os.path.join(target_folder, os.path.basename(source_path)) # 执行迁移(跳过已存在的文件,避免覆盖) if not os.path.exists(target_path): shutil.move(source_path, target_path) print(f"✅ 已迁移:{os.path.basename(source_path)} -> {category}") else: print(f"ℹ️ 文件已存在:{target_path},跳过") print("\n所有图片迁移操作完成")
关键注意事项
- 路径适配:如果运行代码时的工作目录不是
Folder,需手动修改base_dir为Folder的绝对路径 - 扩展名扩展:若你的图片有其他格式,直接将扩展名添加到
image_exts列表即可 - 安全机制:代码会自动跳过找不到的图片和已存在的目标文件,避免中断流程或覆盖数据
内容的提问来源于stack exchange,提问作者Inshal Khan
相关产品推荐
相关产品推荐

