1
-
遍历
G:\Data\train
下所有以数字命名的子文件夹。 -
在每个子文件夹的
spoof
目录中,随机抽取 1 张图像(由images_per_folder=1
控制)。 -
将所选图像复制到
H:\copy
,并在文件名前加上原子文件夹名作为前缀以防重名。
示例
-
源目录结构(执行前)
G:\Data\train
├─ 1001
│ └─ spoof
│ ├─ a.jpg
│ ├─ b.jpg
│ └─ c.jpg
├─ 1002
│ └─ spoof
│ ├─ x.png
│ └─ y.png
└─ other_folder (因非数字命名,将被跳过)
-
目标目录(执行后)
H:\copy
├─ 1001_b.jpg ← 从 1001\spoof 随机抽取 b.jpg,并重命名为 1001_b.jpg
├─ 1002_x.png ← 从 1002\spoof 随机抽取 x.png,并重命名为 1002_x.png
控制台输出示例:
[完成] 从 G:\Data\train\1001\spoof 复制 1 张图片
[完成] 从 G:\Data\train\1002\spoof 复制 1 张图片✅ 所有 spoof 图像复制完成!
1
import os
import shutil
import random# 源数据根目录(train)
source_root = r'G:\Data\train'# 目标目录(你可以改成任意你想要保存的路径)
target_dir = r'H:\copy'# 每个 spoof 文件夹选多少张图
images_per_folder = 1# 确保目标目录存在
os.makedirs(target_dir, exist_ok=True)# 遍历所有数字子文件夹
for subfolder_name in os.listdir(source_root):subfolder_path = os.path.join(source_root, subfolder_name)# 判断是否为数字命名的文件夹if not subfolder_name.isdigit():continuespoof_path = os.path.join(subfolder_path, 'spoof')if not os.path.exists(spoof_path):print(f"[跳过] 未找到 spoof 文件夹: {spoof_path}")continue# 获取所有图像文件(你可以加 .jpg 过滤)image_files = [f for f in os.listdir(spoof_path) if os.path.isfile(os.path.join(spoof_path, f))]if len(image_files) < images_per_folder:print(f"[跳过] 图片不足 {images_per_folder} 张: {spoof_path}")continueselected_images = random.sample(image_files, images_per_folder)for img_name in selected_images:src = os.path.join(spoof_path, img_name)# 防止文件重名,加入文件夹前缀dst = os.path.join(target_dir, f"{subfolder_name}_{img_name}")shutil.copy2(src, dst)print(f"[完成] 从 {spoof_path} 复制 1 张图片")print("\n✅ 所有 spoof 图像复制完成!")
1