商城首页欢迎来到中国正版软件门户

您的位置:首页 >Python自动创建递增文件夹并批量分发文件方法

Python自动创建递增文件夹并批量分发文件方法

  发布于2026-05-20 阅读(0)

扫一扫,手机访问

如何在 Python 中自动创建编号递增的文件夹并批量分发文件

本文介绍如何使用 Python 自动将数千个 PDF 文件按固定数量(如每批 50 个)分组,存入以数字命名(如 batch_001、batch_002)的连续文件夹中,并支持基于模板目录复用空文件夹,同时精准记录每个文件所属的文件夹路径。

本文介绍如何使用 Python 自动将数千个 PDF 文件按固定数量(如每批 50 个)分组,存入以数字命名(如 `batch_001`、`batch_002`)的连续文件夹中,并支持基于模板目录复用空文件夹,同时精准记录每个文件所属的文件夹路径。

在批量处理大量文档(如 3800 个 PDF)时,为适配打印软件对“分批次输出”的要求,需将文件系统化地组织进编号清晰、逻辑连续的文件夹中。以下是一个健壮、易维护的 Python 教程方案,兼顾自动编号建夹模板复用可选文件归属可追溯三大核心需求。

✅ 核心功能说明

  • 自动编号命名:生成形如 batch_001、batch_002 的标准化文件夹名(三位补零,便于排序与识别);
  • 双模式支持
    • 若存在 sorted_template 模板目录(含一个或多个空文件夹),则复制首个模板文件夹并重命名为 batch_001,避免重复创建结构;
    • 否则直接调用 os.makedirs() 创建新文件夹;
  • 精准映射追踪:使用字典 file_to_folder_map 实时记录 filename → batch_X 的对应关系,便于后续生成分发清单、校验或调试。

? 完整可运行代码

import os
import shutil

# ? 配置路径(请根据实际环境修改)
source_directory = r"//All-the-data"              # 源文件所在目录
destination_base_folder = r"//All-the-data/sorted"  # 目标父目录
template_directory = r"//All-the-data/sorted_template"  # 可选:模板空文件夹目录(留空或设为 None 则跳过模板逻辑)

batch_size = 50  # 每批文件数

# ✅ 步骤 1:验证源目录
if not (os.path.exists(source_directory) and os.path.isdir(source_directory)):
    print(f"❌ 错误:源目录不存在 — {source_directory}")
    exit(1)

# ✅ 步骤 2:获取并排序文件(确保顺序稳定,如按字母/时间)
files = [f for f in os.listdir(source_directory) if os.path.isfile(os.path.join(source_directory, f))]
files.sort()  # 默认按字符串升序(适用于 'file001.pdf', 'file002.pdf' 等命名)

# ✅ 步骤 3:初始化计数器与映射表
folder_number = 1
file_to_folder_map = {}

print(f"? 开始处理 {len(files)} 个文件,每 {batch_size} 个一批...")

# ✅ 步骤 4:主循环 — 分批创建文件夹 + 复制文件 + 记录映射
for i in range(0, len(files), batch_size):
    # ? 确定当前批次的目标文件夹路径
    if template_directory and os.path.exists(template_directory) and os.path.isdir(template_directory):
        # 尝试读取模板目录中的第一个子目录(假设为标准空文件夹)
        template_subdirs = [d for d in os.listdir(template_directory) 
                            if os.path.isdir(os.path.join(template_directory, d))]
        if template_subdirs:
            template_path = os.path.join(template_directory, template_subdirs[0])
            target_folder_name = f"batch_{folder_number:03d}"
            batch_directory_path = os.path.join(destination_base_folder, target_folder_name)

            # 复制模板(保留权限、元数据)
            shutil.copytree(template_path, batch_directory_path, dirs_exist_ok=True)
            print(f"? 已从模板复制:{target_folder_name}")
        else:
            print("⚠️  模板目录存在但无子文件夹,将新建编号文件夹")
            batch_directory_path = os.path.join(destination_base_folder, f"batch_{folder_number:03d}")
            os.makedirs(batch_directory_path, exist_ok=True)
    else:
        # 直接新建编号文件夹
        batch_directory_path = os.path.join(destination_base_folder, f"batch_{folder_number:03d}")
        os.makedirs(batch_directory_path, exist_ok=True)

    # ? 批量复制本组文件
    batch_files = files[i:i + batch_size]
    for filename in batch_files:
        src = os.path.join(source_directory, filename)
        dst = os.path.join(batch_directory_path, filename)
        shutil.copy2(src, dst)  # copy2 保留修改时间、权限等元数据
        file_to_folder_map[filename] = batch_directory_path

    print(f"✅ 批次 {folder_number:03d} 完成:{len(batch_files)} 个文件 → {batch_directory_path}")
    folder_number += 1

# ✅ 步骤 5:输出文件-文件夹映射(可用于生成 CSV 或日志)
print("\n? 文件归属总览(前 10 条示例):")
for idx, (fname, fpath) in enumerate(list(file_to_folder_map.items())[:10]):
    print(f"  {fname} → {os.path.basename(fpath)}")
if len(file_to_folder_map) > 10:
    print(f"  ... 还有 {len(file_to_folder_map) - 10} 个文件映射未显示")

# ? 提示:如需导出完整映射到 CSV,可追加如下代码(需 import csv)
# with open(os.path.join(destination_base_folder, "file_mapping.csv"), "w", newline="", encoding="utf-8") as f:
#     writer = csv.writer(f)
#     writer.writerow(["Filename", "BatchFolder"])
#     for fname, fpath in file_to_folder_map.items():
#         writer.writerow([fname, os.path.basename(fpath)])

⚠️ 注意事项与最佳实践

  • 路径写法:Windows 下建议使用原始字符串(r"\\path")或正斜杠("//path"),避免反斜杠转义问题;
  • 模板目录要求:sorted_template 应仅包含空文件夹(无文件),且至少含一个子目录;若不确定,建议先注释掉模板逻辑,使用纯新建模式;
  • 文件筛选:os.listdir() 会返回所有条目(含子目录),因此添加了 os.path.isfile() 过滤,确保只处理文件;
  • 并发安全:本脚本为单线程顺序执行,适合常规批量任务;如需加速(如 SSD + 多核),可引入 concurrent.futures,但需注意 I/O 瓶颈;
  • 错误防御:已加入基础路径检查与异常提示;生产环境建议补充 try/except 包裹 shutil.copy2(),捕获 PermissionError 或 DiskFullError 等。

✅ 总结

该方案摒弃了“先建夹再重命名”的低效方式,改为在创建/复制阶段即赋予规范编号,逻辑更直观、结果更可控。配合 file_to_folder_map 映射表,你不仅能完成打印分批,还可轻松导出分发清单、做一致性校验,甚至对接后续自动化流程(如生成打印指令、邮件通知等)。对于初学者,代码保持了清晰的步骤注释与模块化结构,便于理解与二次定制。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注