您的位置:首页 >Python自动创建递增文件夹并批量分发文件方法
发布于2026-05-20 阅读(0)
扫一扫,手机访问

本文介绍如何使用 Python 自动将数千个 PDF 文件按固定数量(如每批 50 个)分组,存入以数字命名(如 batch_001、batch_002)的连续文件夹中,并支持基于模板目录复用空文件夹,同时精准记录每个文件所属的文件夹路径。
本文介绍如何使用 Python 自动将数千个 PDF 文件按固定数量(如每批 50 个)分组,存入以数字命名(如 `batch_001`、`batch_002`)的连续文件夹中,并支持基于模板目录复用空文件夹,同时精准记录每个文件所属的文件夹路径。
在批量处理大量文档(如 3800 个 PDF)时,为适配打印软件对“分批次输出”的要求,需将文件系统化地组织进编号清晰、逻辑连续的文件夹中。以下是一个健壮、易维护的 Python 教程方案,兼顾自动编号建夹、模板复用可选、文件归属可追溯三大核心需求。
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)])该方案摒弃了“先建夹再重命名”的低效方式,改为在创建/复制阶段即赋予规范编号,逻辑更直观、结果更可控。配合 file_to_folder_map 映射表,你不仅能完成打印分批,还可轻松导出分发清单、做一致性校验,甚至对接后续自动化流程(如生成打印指令、邮件通知等)。对于初学者,代码保持了清晰的步骤注释与模块化结构,便于理解与二次定制。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8