You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按001-002-003序列将数据集有序划分到子文件夹

问题根因
  • os.walk() 遍历文件时默认不做排序,返回顺序由操作系统文件系统决定,无法保证和文件名的自然展示顺序一致,是复制后文件乱序的核心原因。
  • 原代码硬编码Windows路径分隔符\\做路径拆分,跨平台运行会出现路径解析错误,且子文件夹命名没有遵循001、002、003的三位序列规则。
  • 原代码计数逻辑冗余,每12个文件才触发新建文件夹,分组逻辑不直观。
修正实现

修正后的代码会先对收集到的文件做显式排序,严格保证复制顺序,同时自动生成三位序号的子文件夹,兼容多操作系统路径规则:

import os
import shutil

# 路径配置
output_location = "划分后数据集的保存路径"
# 注意:输出路径不要和原数据集路径重合,避免文件覆盖
dataset_path = "原数据集路径"
# 每个子文件夹存放的文件数量,可根据实际需求修改
per_folder_count = 12

# 收集所有待处理文件的完整路径
file_list = []
for root, _, files in os.walk(dataset_path):
    for file in files:
        # 如需过滤特定格式文件,可放开下方注释,修改为需要的后缀
        # if file.lower().endswith(('.jpg', '.jpeg', '.png')):
        file_list.append(os.path.join(root, file))

# 关键步骤:按文件名显式排序,彻底避免遍历顺序随机的问题
file_list.sort(key=lambda x: os.path.basename(x))

# 按顺序分组复制到对应序号文件夹
for file_idx, file_path in enumerate(file_list):
    # 计算当前文件所属子文件夹的序号,从1开始计数
    folder_index = file_idx // per_folder_count + 1
    # 生成三位数字格式的文件夹名,即001、002、003...
    target_folder = os.path.join(output_location, f"{folder_index:03d}")
    # 文件夹不存在时自动创建
    os.makedirs(target_folder, exist_ok=True)
    # 复制文件到目标文件夹,保留原始文件名
    shutil.copy(file_path, os.path.join(target_folder, os.path.basename(file_path)))

提示:如果文件名包含数字且需要符合人类认知的自然排序(例如2.jpg排在10.jpg之前,而非字符串排序的10.jpg在前),可以自定义排序key,用正则提取文件名中的数字转为整型后作为排序依据即可。

内容的提问来源于stack exchange,提问作者RaNa MosBah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.16 16:15:41