Python 智能文件整理器:高效分组,轻松管理海量文件

在日常工作中,面对庞大的文件数量,整理工作往往耗时又繁琐。为此,我使用 Python 编写了一款实用的文件整理器。它能够将目录里的文件按每 1000 个整理到一个文件夹中,首先分析整个目录的文件数量,然后自动新建文件夹(如文件夹 1、文件夹 2 等),将相应数量的文件精准移动。

功能亮点

  • 文件收集 :借助 os.scandir() 高效获取目录中的所有文件,精准排除子目录,确保只处理目标文件。
  • 排序处理 :对文件名进行排序,让每次整理的结果都保持一致,方便后续查找与管理。
  • 智能分组 :自动计算所需文件夹数量,采用向上取整的方式,还支持自定义批量大小,默认为 1000,灵活适配不同需求。
  • 安全处理 :自动检测同名文件 / 目录,提供友好的进度提示,对于错误文件也会有明确的处理提示,保障整理过程的顺利进行。
  • 高效移动 :利用 shutil.move() 实现文件的快速移动操作。

新版本升级

  • 增强路径输入验证 :新增 get_valid_directory() 函数,支持路径中带空格的处理,自动去除路径中的引号,循环验证直到输入有效路径,还支持输入 q 退出程序,让操作更加便捷与人性化。
  • 交互优化 :添加整理前的统计信息确认,以百分比形式显示进度条,使用三位数编号的文件夹(如 001、002...010),完成提示更加清晰,错误文件单独提示,不影响整体进度,提升用户体验。
  • 新增功能 :运用 os.makedirs(exist_ok=True) 自动处理已存在目录,显示每个文件夹的实际移动成功率,添加程序标题和结束标识,异常处理更加完善。
  • 显示优化 :采用符号(✓ × !)增强可读性,统计信息显示对齐,进度更新使用回车符实现原地刷新,让界面更加简洁直观。

使用方法

  • 运行程序后,会立即提示输入路径,支持拖拽文件夹到命令行快速输入路径,输入路径后可查看统计信息并确认,在处理过程中会显示实时进度,每个文件夹处理完成后会显示成功统计。特别注意,此版本已支持路径中包含空格的情况,可直接拖拽包含空格的文件夹路径到命令行中使用,让你轻松告别文件整理的烦恼,大幅提升工作效率。

代码:

import os
import shutil
from math import ceil

def get_valid_directory():
    """获取有效的目录路径"""
    while True:
        path = input("请输入要整理的目录路径(或输入q退出): ").strip()
        if path.lower() == 'q':
            exit()
        
        # 处理路径中的引号和空格
        path = path.replace('"', '').replace("'", "")
        
        if not os.path.exists(path):
            print(f"× 路径不存在:{path}")
            continue
            
        if not os.path.isdir(path):
            print(f"× 这不是一个目录:{path}")
            continue
            
        return os.path.abspath(path)

def organize_files(source_dir, batch_size=1000):
    try:
        # 获取所有文件列表(排除目录)
        files = []
        with os.scandir(source_dir) as entries:
            for entry in entries:
                if entry.is_file():
                    files.append(entry.name)
        
        # 按文件名排序
        files.sort()
        
        total_files = len(files)
        if total_files == 0:
            print("没有找到需要整理的文件")
            return
        
        # 显示统计信息
        print("\n" + "="*40)
        print(f"目录路径:{source_dir}")
        print(f"文件总数:{total_files}")
        print(f"每个文件夹存放数量:{batch_size}")
        print(f"将创建 {ceil(total_files / batch_size)} 个文件夹")
        print("="*40 + "\n")
        
        # 用户确认
        confirm = input("是否开始整理?(y/n) ").lower()
        if confirm != 'y':
            print("操作已取消")
            return
        
        # 创建文件夹并移动文件
        for i in range(ceil(total_files / batch_size)):
            folder_name = os.path.join(source_dir, f"文件夹{i+1:03d}")  # 使用三位数编号
            
            # 创建文件夹(如果不存在)
            os.makedirs(folder_name, exist_ok=True)
            
            # 获取当前批次的文件
            start = i * batch_size
            end = start + batch_size
            current_batch = files[start:end]
            
            # 移动文件并显示进度
            moved = 0
            for idx, filename in enumerate(current_batch, 1):
                src_path = os.path.join(source_dir, filename)
                dst_path = os.path.join(folder_name, filename)
                
                try:
                    shutil.move(src_path, dst_path)
                    moved += 1
                except Exception as e:
                    print(f"! 移动文件失败:{filename} - {str(e)}")
                
                # 显示进度条
                progress = idx / len(current_batch) * 100
                print(f"\r正在移动文件到 文件夹{i+1:03d}: {progress:.1f}%", end='')
            
            print(f"\n✓ 成功移动 {moved}/{len(current_batch)} 个文件到 {folder_name}")

    except Exception as e:
        print(f"发生错误:{str(e)}")

if __name__ == "__main__":
    print("="*40)
    print("文件整理器 v2.0".center(40))
    print("="*40)
    
    target_dir = get_valid_directory()
    organize_files(target_dir)
    
    print("\n" + "="*40)
    print("文件整理完成!".center(40))
    print("="*40)

数量可以自己修改代码。

  • All rights reserved.
  • No part of this website, including text and images, may be reproduced, modified, distributed, or transmitted in any form or by any means, without the prior written permission of the author.
  • Unauthorized commercial use is strictly prohibited.
  • Unauthorized personal use is strictly prohibited.