python(53) : 文件夹内文件等分工具[Windows工具(7)]

1.说明

一款简洁实用的文件分组工具,能够将文件夹中的文件按指定数量自动分组到多个子文件夹中,轻松管理大量文件。

✨ 功能特性

  • 🖱️ 拖拽操作:简单直观的图形界面,支持拖拽文件夹
  • 📊 智能分组:按指定数量自动将文件分配到多个子文件夹
  • 🔢 灵活配置:可自定义每组文件数量(默认 100 个)
  • 📁 自动创建:自动创建 part_1part_2part_3 等分组文件夹
  • 🚀 批量处理:适合处理包含大量文件的文件夹
  • ✅ 实时反馈:显示处理进度和分组结果

📋 功能说明

主要用途

  • 将大量文件分批处理,便于管理
  • 按批次整理照片、文档等文件
  • 为文件分组便于分批上传或传输
  • 整理下载文件、日志文件等

工作原理

  1. 扫描指定文件夹中的所有文件(不包括子目录)
  2. 按照设定的数量将文件分组
  3. 在原文件夹内创建 part_1part_2part_3 等子文件夹
  4. 将文件移动到相应的子文件夹中(原位置文件会被移走)

🔧 安装依赖

环境要求

  • Python 3.6+
  • Windows/Linux/macOS

依赖包安装

pip install tkinterdnd2

注意tkinter 通常随 Python 自带,无需额外安装

🚀 使用方法

启动程序

python 将文件夹内文件等分.pyw

或直接双击 .pyw 文件(Windows 下无命令行窗口)

操作步骤

  1. 设置分组数量

    • 在"每组文件数量"输入框中输入期望的每组文件数(默认 100)
    • 可根据实际需求调整
  2. 拖入文件夹

    • 将需要分组的文件夹拖拽到蓝色区域
    • 确保拖入的是文件夹而不是单个文件
  3. 自动分组

    • 程序自动开始处理
    • 文件将被移动到新创建的 part_X 子文件夹中
  4. 查看结果

    • 界面底部显示处理结果
    • 包括总文件数、分组数、每组数量和处理位置

📊 使用示例

示例 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 - 文件移动操作

⚠️ 注意事项

  1. 文件会被移动:文件会从原位置移动到子文件夹,不是复制

    • 如需保留原文件,可修改代码第 31 行,将 shutil.move 改为 shutil.copy2
  2. 仅处理根目录文件:只处理文件夹根目录的文件,不会递归处理子目录

  3. 数量验证:必须输入大于 0 的整数,否则会提示错误

  4. 空文件夹:如果文件夹中没有文件,会提示"该文件夹中没有文件"

  5. 子文件夹已存在

    • 如果目标文件夹已存在 part_X 子文件夹,程序会继续使用(不会删除原有内容)
    • 建议在干净的文件夹中使用,避免冲突
  6. 权限问题:确保对目标文件夹有读写权限

🔄 复制模式 vs 移动模式

当前模式:移动(默认)

shutil.move(src, dst)  # 文件会从原位置移走

如需改为复制模式

修改代码第 31 行:

shutil.copy2(src, dst)  # 保留原文件,复制到新位置

💡 使用技巧

  1. 快速整理:处理大量下载文件、截图时特别实用
  2. 分批上传:将大量文件分组后,可分批次上传到云盘
  3. 项目管理:按数量分组项目文件,便于分批处理
  4. 备份策略:分组后可以分批备份到不同存储设备

🐛 常见问题

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()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值