1.说明
一款简洁实用的文件分组工具,能够将文件夹中的文件按指定数量自动分组到多个子文件夹中,轻松管理大量文件。
✨ 功能特性
- 🖱️ 拖拽操作:简单直观的图形界面,支持拖拽文件夹
- 📊 智能分组:按指定数量自动将文件分配到多个子文件夹
- 🔢 灵活配置:可自定义每组文件数量(默认 100 个)
- 📁 自动创建:自动创建
part_1、part_2、part_3等分组文件夹 - 🚀 批量处理:适合处理包含大量文件的文件夹
- ✅ 实时反馈:显示处理进度和分组结果
📋 功能说明
主要用途
- 将大量文件分批处理,便于管理
- 按批次整理照片、文档等文件
- 为文件分组便于分批上传或传输
- 整理下载文件、日志文件等
工作原理
- 扫描指定文件夹中的所有文件(不包括子目录)
- 按照设定的数量将文件分组
- 在原文件夹内创建
part_1、part_2、part_3等子文件夹 - 将文件移动到相应的子文件夹中(原位置文件会被移走)
🔧 安装依赖
环境要求
- Python 3.6+
- Windows/Linux/macOS
依赖包安装
pip install tkinterdnd2
注意:
tkinter通常随 Python 自带,无需额外安装
🚀 使用方法
启动程序
python 将文件夹内文件等分.pyw
或直接双击 .pyw 文件(Windows 下无命令行窗口)
操作步骤
-
设置分组数量
- 在"每组文件数量"输入框中输入期望的每组文件数(默认 100)
- 可根据实际需求调整
-
拖入文件夹
- 将需要分组的文件夹拖拽到蓝色区域
- 确保拖入的是文件夹而不是单个文件
-
自动分组
- 程序自动开始处理
- 文件将被移动到新创建的 part_X 子文件夹中
-
查看结果
- 界面底部显示处理结果
- 包括总文件数、分组数、每组数量和处理位置
📊 使用示例
示例 1:基本使用
操作前:
📁 照片集合/
├── IMG_0001.jpg
├── IMG_0002.jpg
├── IMG_0003.jpg
├── ...
└── IMG_0250.jpg (共 250 个文件)
设置每组 100 个文件,拖拽"照片集合"文件夹
操作后:
📁 照片集合/
├── 📁 part_1/
│ ├── IMG_0001.jpg
│ ├── IMG_0002.jpg
│ ├── ...
│ └── IMG_0100.jpg (100 个文件)
├── 📁 part_2/
│ ├── IMG_0101.jpg
│ ├── IMG_0102.jpg
│ ├── ...
│ └── IMG_0200.jpg (100 个文件)
└── 📁 part_3/
├── IMG_0201.jpg
├── IMG_0202.jpg
├── ...
└── IMG_0250.jpg (50 个文件)
结果显示:
✅ 成功:
250 个文件已分为 3 组
每组最多 100 个
位置:C:\Users\xxx\照片集合
示例 2:小数量分组
操作前:
📁 文档/
├── doc1.docx
├── doc2.docx
├── ...
└── doc25.docx (共 25 个文件)
设置每组 10 个文件
操作后:
📁 文档/
├── 📁 part_1/ (10 个文件)
├── 📁 part_2/ (10 个文件)
└── 📁 part_3/ (5 个文件)
⚙️ 技术实现
核心函数
-
split_files_by_count()- 文件分组核心逻辑- 扫描文件夹中的所有文件
- 按指定数量分组
- 创建子文件夹并移动文件
-
on_drop()- 拖拽事件处理- 验证输入参数
- 调用分组函数
- 显示处理结果
主要依赖
tkinter- GUI 界面框架tkinterdnd2- 拖拽功能支持os- 文件系统操作shutil- 文件移动操作
⚠️ 注意事项
-
文件会被移动:文件会从原位置移动到子文件夹,不是复制
- 如需保留原文件,可修改代码第 31 行,将
shutil.move改为shutil.copy2
- 如需保留原文件,可修改代码第 31 行,将
-
仅处理根目录文件:只处理文件夹根目录的文件,不会递归处理子目录
-
数量验证:必须输入大于 0 的整数,否则会提示错误
-
空文件夹:如果文件夹中没有文件,会提示"该文件夹中没有文件"
-
子文件夹已存在:
- 如果目标文件夹已存在
part_X子文件夹,程序会继续使用(不会删除原有内容) - 建议在干净的文件夹中使用,避免冲突
- 如果目标文件夹已存在
-
权限问题:确保对目标文件夹有读写权限
🔄 复制模式 vs 移动模式
当前模式:移动(默认)
shutil.move(src, dst) # 文件会从原位置移走
如需改为复制模式
修改代码第 31 行:
shutil.copy2(src, dst) # 保留原文件,复制到新位置
💡 使用技巧
- 快速整理:处理大量下载文件、截图时特别实用
- 分批上传:将大量文件分组后,可分批次上传到云盘
- 项目管理:按数量分组项目文件,便于分批处理
- 备份策略:分组后可以分批备份到不同存储设备
🐛 常见问题
Q: 拖拽后提示"请拖入一个有效的文件夹"?
A: 请确保拖入的是文件夹而不是单个文件,工具仅支持文件夹操作。
Q: 可以处理子文件夹中的文件吗?
A: 当前版本只处理根目录的文件,不会递归处理子文件夹中的文件。
Q: 文件会被覆盖吗?
A: 不会。程序使用 shutil.move,如果目标位置已存在同名文件,会抛出错误而不是覆盖。
Q: 可以撤销操作吗?
A: 工具本身不提供撤销功能,但由于文件只是被移动到子文件夹,可以手动将文件移回原位置。
Q: 分组顺序是什么?
A: 按照 os.listdir() 的返回顺序,通常是文件名的字母/数字顺序。
Q: 处理大文件夹会卡顿吗?
A: 移动文件速度很快,通常不会卡顿。但文件数量特别多(数万个)时可能需要等待几秒。
📊 性能说明
- 小规模(< 1000 文件):几乎瞬间完成
- 中等规模(1000-10000 文件):通常在 1-5 秒内完成
- 大规模(> 10000 文件):可能需要 10-30 秒
注:性能取决于硬盘速度和文件数量
2.python代码
import os
import shutil
import tkinter as tk
from tkinter import messagebox
from tkinterdnd2 import DND_FILES, TkinterDnD
def split_files_by_count(folder_path, count_per_folder):
"""
将文件夹中的文件按指定数量分组,移动到 part_1, part_2, ... 子文件夹中
"""
# 获取所有文件(排除子目录)
all_files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
if not all_files:
return 0, 0 # 没有文件
total_files = len(all_files)
groups = 0
# 按数量分组
for i in range(0, total_files, count_per_folder):
groups += 1
group_folder = os.path.join(folder_path, f"part_{groups}")
os.makedirs(group_folder, exist_ok=True)
batch = all_files[i:i + count_per_folder]
for filename in batch:
src = os.path.join(folder_path, filename)
dst = os.path.join(group_folder, filename)
shutil.move(src, dst) # 移动文件(改为 copy 可复制)
return total_files, groups
def on_drop(event):
# 获取拖入的路径(去除花括号)
folder_path = event.data.strip('{}')
if not os.path.isdir(folder_path):
status_label.config(text="❌ 错误:请拖入一个有效的文件夹!", fg="red")
return
try:
num = int(entry.get().strip())
if num <= 0:
raise ValueError
except ValueError:
status_label.config(text="❌ 错误:请输入大于 0 的整数!", fg="red")
return
# 开始分组
try:
total, groups = split_files_by_count(folder_path, num)
if total == 0:
status_label.config(text="🟡 提示:该文件夹中没有文件。", fg="orange")
else:
status_label.config(
text=f"✅ 成功:\n{total} 个文件已分为 {groups} 组\n每组最多 {num} 个\n位置:{folder_path}",
fg="green"
)
except Exception as e:
status_label.config(text=f"❌ 错误:{str(e)}", fg="red")
# ========== GUI 界面 ==========
root = TkinterDnD.Tk()
root.title("文件分组工具 - 拖拽文件夹")
root.geometry("500x300")
# 标题
tk.Label(
root,
text="文件分组工具",
font=("微软雅黑", 16, "bold"),
fg="blue"
).pack(pady=10)
# 拖拽区域
drop_label = tk.Label(
root,
text="请将文件夹拖拽到此处\n\n支持自动分组",
bg="lightblue",
fg="black",
font=("微软雅黑", 12),
relief="solid",
width=50,
height=4,
justify="center"
)
drop_label.pack(padx=20, pady=10)
# 数量输入
input_frame = tk.Frame(root)
input_frame.pack(pady=5)
tk.Label(input_frame, text="每组文件数量:", font=("微软雅黑", 10)).pack(side="left")
entry = tk.Entry(input_frame, width=10, font=("微软雅黑", 10))
entry.insert(0, "100") # 默认值
entry.pack(side="left", padx=5)
# 状态显示
status_label = tk.Label(
root,
text="等待拖入文件夹...",
bg="white",
fg="gray",
font=("微软雅黑", 10),
anchor="w",
justify="left",
height=4,
wraplength=480,
relief="sunken"
)
status_label.pack(padx=20, pady=10, fill="x")
# 启用拖拽
drop_label.drop_target_register(DND_FILES)
drop_label.dnd_bind('<<Drop>>', on_drop)
# 运行主循环
root.mainloop()


被折叠的 条评论
为什么被折叠?



