70 lines
2.5 KiB
Python
70 lines
2.5 KiB
Python
import os
|
||
import shutil
|
||
from pathlib import Path
|
||
|
||
def split_images_into_five(source_dir, target_root, move_instead_of_copy=True):
|
||
"""
|
||
将 source_dir 中的图片均分为 5 份,保存到 target_root/1 ~ 5/
|
||
|
||
:param source_dir: 源图片文件夹路径
|
||
:param target_root: 目标根目录(会创建 1~5 子文件夹)
|
||
:param move_instead_of_copy: True 表示移动,False 表示复制(默认为 True 移动)
|
||
"""
|
||
source = Path(source_dir)
|
||
target_root = Path(target_root)
|
||
|
||
# 支持的图片扩展名
|
||
image_extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.tif', '.webp'}
|
||
|
||
# 获取所有图片文件(按名称排序,保证可重复性)
|
||
all_images = sorted([
|
||
f for f in source.iterdir()
|
||
if f.is_file() and f.suffix.lower() in image_extensions
|
||
])
|
||
|
||
if not all_images:
|
||
print("❌ 源文件夹中没有找到图片!")
|
||
return
|
||
|
||
total = len(all_images)
|
||
print(f"📁 共找到 {total} 张图片")
|
||
|
||
# 均分为 5 份
|
||
chunk_size = (total + 4) // 5 # 向上取整,确保覆盖所有图片
|
||
|
||
# 创建 1~5 文件夹并分发图片
|
||
for i in range(5):
|
||
start_idx = i * chunk_size
|
||
end_idx = min((i + 1) * chunk_size, total)
|
||
if start_idx >= total:
|
||
break # 防止空分片
|
||
|
||
folder_name = str(i + 1)
|
||
target_folder = target_root / folder_name
|
||
target_folder.mkdir(parents=True, exist_ok=True)
|
||
|
||
chunk_files = all_images[start_idx:end_idx]
|
||
print(f"📦 文件夹 {folder_name}: 分配 {len(chunk_files)} 张图片")
|
||
|
||
for img_path in chunk_files:
|
||
dst = target_folder / img_path.name
|
||
if move_instead_of_copy:
|
||
shutil.move(str(img_path), str(dst))
|
||
print(f" 📂 已移动: {img_path.name}")
|
||
else:
|
||
shutil.copy2(str(img_path), str(dst))
|
||
print(f" 📂 已复制: {img_path.name}")
|
||
|
||
print(f"\n✅ 分割完成!结果保存在: {target_root}")
|
||
|
||
if __name__ == "__main__":
|
||
# ========================
|
||
# ⚙️ 配置你的路径
|
||
# ========================
|
||
SOURCE_DIR = "/media/hx/04e879fa-d697-4b02-ac7e-a4148876ebb0/dataset/1/分割/class3"
|
||
TARGET_ROOT = "/media/hx/04e879fa-d697-4b02-ac7e-a4148876ebb0/dataset/1/分割/class3"
|
||
|
||
# 设置为 True 则移动图片(原图会被移走),False 则复制(推荐先用 False 测试)
|
||
MOVE_MODE = True
|
||
|
||
split_images_into_five(SOURCE_DIR, TARGET_ROOT, move_instead_of_copy=MOVE_MODE) |