用于将指定路径下的 0-6 编号的 7 个文件夹中的数据按照 8:1:1 的比例划分到 train、val 和 test 这三个文件夹中。
1.代码功能说明
- 源文件夹路径:假设编号文件夹在 src_path 中,每个编号文件夹的名称为 0, 1, 2, ..., 6。
- 划分比例:默认按照 8:1:1 的比例划分,分别对应训练集、验证集和测试集。
- 数据打乱:使用 random.shuffle 将每个编号文件夹内的文件顺序打乱,确保划分均匀。
- 目标文件夹创建:在 dest_path 下创建 train、val 和 test 文件夹。
- 文件复制:使用 shutil.copy 将文件从源文件夹复制到目标文件夹。
python
import os
import shutil
import random
def split_data(src_path, dest_path, split_ratio=(0.8, 0.1, 0.1)):
# 创建目标文件夹结构
for split in ['train', 'val', 'test']:
split_path = os.path.join(dest_path, split)
os.makedirs(split_path, exist_ok=True)
for i in range(7): # 创建 0-6 的子文件夹
os.makedirs(os.path.join(split_path, str(i)), exist_ok=True)
# 遍历编号文件夹(0-6)
for folder in range(7):
folder_path = os.path.join(src_path, str(folder))
if not os.path.exists(folder_path):
print(f"文件夹 {folder_path} 不存在,跳过...")
continue
# 获取文件列表并打乱顺序
files = os.listdir(folder_path)
random.shuffle(files)
# 按照比例划分
total_files = len(files)
train_end = int(total_files * split_ratio[0])
val_end = train_end + int(total_files * split_ratio[1])
train_files = files[:train_end]
val_files = files[train_end:val_end]
test_files = files[val_end:]
# 将文件复制到对应的目标文件夹
for file in train_files:
shutil.copy(os.path.join(folder_path, file), os.path.join(dest_path, "train", str(folder), file))
for file in val_files:
shutil.copy(os.path.join(folder_path, file), os.path.join(dest_path, "val", str(folder), file))
for file in test_files:
shutil.copy(os.path.join(folder_path, file), os.path.join(dest_path, "test", str(folder), file))
print(f"文件夹 {folder_path} 已处理完成,训练集:{len(train_files)},验证集:{len(val_files)},测试集:{len(test_files)}")
# 使用
src_path = "/path/to/source/folders" # 原始数据文件夹路径
dest_path = "/path/to/destination/folders" # 目标文件夹路径
split_data(src_path, dest_path)