如何用Pandas DataFrame的if语句复制图片至新目录?代码异常求助
问题分析与代码修正
你的代码目前出现的问题很明确:每次执行split_image_to_folder函数时,都会遍历源目录下所有.png图片,再根据当前行的E值把所有图片复制到对应目录。而df.apply是逐行执行这个函数的,所以处理E=False的行时,所有图片会被复制到dir_0;处理E=True的行时,所有图片又会被复制到dir_1,最终所有图片同时出现在两个目录里,完全不符合按行匹配图片的需求。
正确的逻辑应该是:每一行对应一个特定图片(通过A列的文件名匹配),根据该行E列的布尔值,将这个特定图片复制到对应目录。
修正后的完整代码
首先确保导入必要的库:
import os import shutil import pandas as pd
然后是核心代码:
src_dir = "/Users/Downloads/copy_image_test/source_dir" dst_dir1 = "/Users/Downloads/copy_image_test/target_dir/1" dst_dir0 = "/Users/Downloads/copy_image_test/target_dir/0" # 预先创建目标目录,避免复制时因目录不存在报错 os.makedirs(dst_dir0, exist_ok=True) os.makedirs(dst_dir1, exist_ok=True) def split_image_to_folder(row): # 根据A列的文件名前缀,拼接完整的源图片路径 image_name = f"{row['A']}.png" src_image_path = os.path.join(src_dir, image_name) # 检查源文件是否存在,避免找不到文件导致报错 if not os.path.exists(src_image_path): print(f"图片 {image_name} 不存在,跳过处理") return # 根据E列的布尔值选择目标目录 target_dir = dst_dir1 if row['E'] else dst_dir0 shutil.copy(src_image_path, target_dir) df.apply(split_image_to_folder, axis=1)
代码关键说明
- 目标目录预创建:使用
os.makedirs(..., exist_ok=True)确保目标目录存在,不存在则自动创建,避免复制操作因目录缺失失败。 - 精准匹配图片:不再遍历所有图片,而是根据每行
A列的文件名前缀(如english_0)拼接出对应图片的完整路径(english_0.png),确保每行只处理自己对应的图片。 - 容错性处理:增加源文件存在性检查,避免因某个图片缺失导致整个程序中断。
- 正确的分支逻辑:直接根据
E列的布尔值(True/False)选择目标目录,适配你的DataFrame中E列的类型。
额外优化方案
如果图片数量较多,df.apply逐行处理的效率可能偏低,你可以改用iterrows循环遍历DataFrame,逻辑完全一致:
for _, row in df.iterrows(): image_name = f"{row['A']}.png" src_image_path = os.path.join(src_dir, image_name) if not os.path.exists(src_image_path): print(f"图片 {image_name} 不存在,跳过处理") continue target_dir = dst_dir1 if row['E'] else dst_dir0 shutil.copy(src_image_path, target_dir)
内容的提问来源于stack exchange,提问作者Erin
相关产品推荐
相关产品推荐

