如何用Python按66:17:17比例将单文件夹文件随机拆分至多子文件夹
按比例随机拆分文件到多个子文件夹的Python脚本
以下是可以一键完成66:17:17比例拆分的脚本,适配你的需求:
import shutil import random import os # 配置路径和拆分规则 SOURCE_DIR = 'C:\\Cyrb\\Workspace\\Sound_Training\\Python_Scripts\\Random_Selection_Tool\\Source' TARGET_ROOT_DIR = 'C:\\Cyrb\\Workspace\\Sound_Training\\Python_Scripts\\Random_Selection_Tool\\Destination' # 定义拆分规则:文件夹名称 -> 占比 SPLIT_RULES = [ ('Training', 0.66), ('Validation', 0.17), ('Testing', 0.17) ] def split_files_by_ratio(): # 仅获取源目录下的文件(排除子文件夹) all_files = [f for f in os.listdir(SOURCE_DIR) if os.path.isfile(os.path.join(SOURCE_DIR, f))] total_files = len(all_files) if total_files == 0: print("源目录中没有可处理的文件") return # 随机打乱文件列表,确保拆分随机性 random.shuffle(all_files) current_idx = 0 for folder_name, ratio in SPLIT_RULES: # 计算当前文件夹应分配的文件数量 file_count = int(total_files * ratio) # 最后一个文件夹接收所有剩余文件,避免四舍五入导致总数偏差 if folder_name == SPLIT_RULES[-1][0]: file_count = total_files - current_idx # 截取对应批次的文件 selected_files = all_files[current_idx:current_idx + file_count] current_idx += file_count # 自动创建目标文件夹(已存在则跳过) target_folder = os.path.join(TARGET_ROOT_DIR, folder_name) os.makedirs(target_folder, exist_ok=True) # 移动文件到目标文件夹 for file_name in selected_files: src_path = os.path.join(SOURCE_DIR, file_name) dest_path = os.path.join(target_folder, file_name) shutil.move(src_path, dest_path) print("文件拆分完成!") if __name__ == "__main__": split_files_by_ratio()
关键说明
- 路径修改:直接替换
SOURCE_DIR和TARGET_ROOT_DIR为你的实际路径即可 - 比例调整:如果需要更改拆分比例,修改
SPLIT_RULES中的数值即可,脚本会自动计算对应文件数量 - 随机性保障:通过
random.shuffle打乱文件列表,避免抽取偏差 - 边界处理:最后一个文件夹自动接收剩余所有文件,解决文件总数无法被比例整除的问题
- 自动建文件夹:无需手动创建子文件夹,脚本会自动生成
- 过滤非文件:仅处理源目录下的文件,不会误操作子文件夹
注意事项
- 如果需要复制文件而非移动,将
shutil.move替换为shutil.copy2(保留文件元数据) - 运行前建议备份源文件,避免误操作导致文件丢失
内容的提问来源于stack exchange,提问作者K.dj
相关产品推荐
相关产品推荐

