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

如何用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)

代码关键说明

  1. 目标目录预创建:使用os.makedirs(..., exist_ok=True)确保目标目录存在,不存在则自动创建,避免复制操作因目录缺失失败。
  2. 精准匹配图片:不再遍历所有图片,而是根据每行A列的文件名前缀(如english_0)拼接出对应图片的完整路径(english_0.png),确保每行只处理自己对应的图片。
  3. 容错性处理:增加源文件存在性检查,避免因某个图片缺失导致整个程序中断。
  4. 正确的分支逻辑:直接根据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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:11:49