Files
zjsh_yolov11/tool/d_n.py

105 lines
3.3 KiB
Python
Raw Normal View History

2026-03-10 13:58:21 +08:00
import os
import shutil
import math
# ================= 配置区域 =================
# 【全局变量】在这里修改你要分成的份数
N_FOLDERS = 4
# 源文件夹名称 (相对于当前脚本运行目录)
SOURCE_DIR_NAME = "camera02_save"
# 支持的图片扩展名
VALID_EXTENSIONS = ('.jpg', '.jpeg', '.png', '.bmp', '.tif', '.tiff')
# ===========================================
def split_images_to_subfolders():
# 1. 获取当前脚本所在的绝对路径
base_dir = os.getcwd()
source_path = os.path.join(base_dir, SOURCE_DIR_NAME)
# 2. 检查源文件夹是否存在
if not os.path.exists(source_path):
print(f"❌ 错误: 找不到文件夹 '{source_path}'")
print("请确保脚本在包含 'camera02_save' 的目录下运行。")
return
# 3. 获取所有图片文件列表
all_files = os.listdir(source_path)
image_files = [
f for f in all_files
if f.lower().endswith(VALID_EXTENSIONS) and os.path.isfile(os.path.join(source_path, f))
]
# 按文件名排序,保证分配顺序一致(可选)
image_files.sort()
total_count = len(image_files)
if total_count == 0:
print(f"警告: '{source_path}' 中没有找到任何图片文件。")
return
print(f"发现图片总数: {total_count}")
print(f"计划分成: {N_FOLDERS}")
# 4. 计算分配逻辑
# 使用轮询方式分配,确保每个文件夹数量尽可能平均
# 例如10张图分3份 -> 4, 3, 3
created_folders = []
for index, filename in enumerate(image_files):
# 计算该图片应该去哪个子文件夹 (0 到 N_FOLDERS-1)
folder_index = index % N_FOLDERS
subfolder_name = f"part_{folder_index}"
# 构建子文件夹完整路径
dest_folder_path = os.path.join(source_path, subfolder_name)
# 如果文件夹不存在,则创建
if not os.path.exists(dest_folder_path):
os.makedirs(dest_folder_path)
created_folders.append(subfolder_name)
print(f"✅ 创建子文件夹: {subfolder_name}")
# 构建源文件和目标文件路径
src_file = os.path.join(source_path, filename)
dst_file = os.path.join(dest_folder_path, filename)
# 移动文件 (剪切)
try:
shutil.move(src_file, dst_file)
except Exception as e:
print(f"❌ 移动失败 {filename}: {e}")
# 5. 统计结果
print("\n" + "=" * 30)
print("分配完成!统计如下:")
print("=" * 30)
# 重新扫描统计每个文件夹的数量
final_counts = {}
for i in range(N_FOLDERS):
fname = f"part_{i}"
fpath = os.path.join(source_path, fname)
if os.path.exists(fpath):
count = len([f for f in os.listdir(fpath) if f.lower().endswith(VALID_EXTENSIONS)])
final_counts[fname] = count
print(f"{fname}: {count} 张图片")
print("=" * 30)
print(f"总计移动: {sum(final_counts.values())} 张图片")
if __name__ == "__main__":
# 提示用户确认
print(f"当前工作目录: {os.getcwd()}")
confirm = input(f"即将把 '{SOURCE_DIR_NAME}' 中的图片均分为 {N_FOLDERS} 份。\n是否继续?(y/n): ")
if confirm.lower() == 'y':
split_images_to_subfolders()
else:
print("操作已取消。")