我开发了一个文件智能分类工具,彻底解决了桌面文件杂乱的问题

246 阅读18分钟

引言

在日常工作中,我们经常面临文件管理的困扰:下载目录堆积如山、桌面凌乱不堪、项目文件夹缺乏秩序。面对成百上千的文件,手动分类不仅耗时费力,还容易出错。作为一名开发者,我深知高效文件管理对工作效率的重要性,因此开发了这款基于Python和PyQt5的文件智能分类工具

这款工具的核心价值在于:一键自动分类,释放双手,让文件管理变得简单而优雅。它能够根据文件后缀自动识别文件类型,并将文件移动到对应的分类文件夹中,同时处理同名文件冲突,支持自定义文件类型和分类规则。无论是个人整理电脑,还是团队协作管理项目文件,都能显著提升文件管理效率。

功能特点

这款文件分类工具经过精心设计,聚焦实用性,核心功能覆盖了文件管理的各个环节:

  • 拖放操作:支持将文件夹直接拖放到程序界面,无需繁琐的点击操作,整个流程行云流水
  • 手动选择:也可以通过按钮手动选择需要分类的文件夹,满足不同场景的使用需求
  • 智能识别:根据文件后缀自动识别文件类型,内置20+种常见文件类型分类规则,开箱即用
  • 灵活选择:可以精准选择需要处理的文件类型,精确控制分类范围,避免误操作
  • 自动建档:自动创建分类文件夹,分类后的文件一目了然,查找效率提升数倍
  • 智能防重:同名文件自动添加数字后缀,完全避免文件覆盖丢失的风险
  • 深度定制:支持用户自定义文件类型和分类规则,满足个性化需求
  • 护眼主题:支持浅色/深色主题自动切换,紧跟系统设置,保护视力
  • 多语言支持:内置中英文切换,界面语言随系统设置自动适配
  • 实时统计:分类完成后实时显示统计报告,清晰掌握分类结果
  • 子文件夹排除:可设置需要排除的子文件夹,精准控制处理范围

实用场景

这款工具在以下场景中能够发挥巨大作用,帮助用户高效管理文件:

场景一:整理下载目录 每次下载文件后,下载目录都会堆积大量文件,时间一长便杂乱无章。使用本工具可以快速将下载的文件按类型分类:文档归文档、图片归图片、压缩包归压缩包,让下载目录时刻保持整洁。

场景二:项目管理归档 项目开发过程中会产生各种类型的文件:源代码、文档、图片、配置文件等。项目结束时,使用本工具可以快速整理项目文件夹,将不同类型的文件归类到相应子目录,便于后续查阅和维护。

场景三:媒体文件整理 摄影师、设计师等创作者电脑中通常存放着大量媒体文件。使用本工具可以将图片、音频、视频等媒体文件自动分类,快速建立有序的媒体资料库。

场景四:团队文件交接 团队协作中,文件命名和存放往往缺乏统一规范。交接前使用本工具整理一遍,可以让接收方快速理解文件结构,提升团队协作效率。

场景五:个人资料归档 日常工作中积累的各类资料、报告、表格,使用本工具定期整理,可以快速建立个人知识档案库,查找资料更加便捷。

界面展示

主界面

工具的主界面简洁明了,主要分为几个区域:

  • 拖放区域:用于接收用户拖放的文件夹,拖放即选择,响应迅速
  • 文件夹选择区:用于手动选择文件夹,支持路径显示和子文件夹扫描
  • 文件类型设置区:用于选择需要处理的文件类型,支持全选/取消全选/自定义
  • 子文件夹设置区:用于设置不需要处理的子文件夹,避免误处理重要内容
  • 统计报告面板:分类完成后实时显示分类统计结果,直观掌握处理成效
  • 开始分类按钮:一键启动分类过程,按钮状态实时反馈处理进度

主界面

自定义文件类型对话框

通过自定义文件类型对话框,用户可以:

  • 查看所有已定义的文件类型及其扩展名列表
  • 编辑现有的文件类型和对应的扩展名
  • 添加新的自定义文件类型,满足特殊分类需求
  • 删除不需要的文件类型,保持分类规则简洁

自定义文件类型

深色主题模式

深色主题采用精心设计的配色方案,长时间使用也不易疲劳:

  • 背景色采用柔和的深灰色,减少屏幕眩光
  • 文字颜色经过优化,确保在深色背景下的可读性
  • 交互元素高亮显示,操作状态清晰可见
  • 紧跟系统主题设置,Windows/macOS均可完美适配

深色主题

多语言界面

界面语言支持自动切换,满足国际化使用需求:

  • 中文界面:默认使用中文,贴合国内用户使用习惯
  • 英文界面:自动检测系统语言,英文系统显示英文界面
  • 实时切换:语言设置即时生效,无需重启应用
  • 完整覆盖:所有界面元素均已实现多语言适配

多语言支持

使用教程

1. 安装和运行

环境要求

本工具支持Windows、macOS和Linux操作系统,要求Python 3.7及以上版本。建议使用Python 3.8或更高版本以获得最佳兼容性。

安装依赖

首先,确保你已经安装了Python 3.x环境,然后克隆项目并安装必要的依赖库:

# 克隆项目
git clone https://gitee.com/yabar/file_storter.git
cd file_storter

# 安装依赖
pip install -r requirements.txt

requirements.txt文件中包含了以下主要依赖:

  • PyQt5:强大的GUI框架,提供丰富的界面组件
  • 其他依赖:Python标准库,无需额外安装

运行程序

在命令行中执行以下命令运行程序:

python file_sorter.py

程序启动后会显示主窗口,你可以开始使用各项功能。

2. 选择文件夹

选择需要分类的文件夹是使用本工具的第一步。你可以通过两种方式完成:

方式一:拖放选择(推荐) 直接将文件夹从文件管理器拖放到程序的拖放区域,程序会自动识别并显示文件夹路径。这种方式简单快捷,适合大多数场景。

方式二:手动选择 点击"选择文件夹"按钮,弹出系统文件夹选择对话框,在对话框中找到并选择目标文件夹。适合需要精确浏览文件夹结构的场景。

选定文件夹后,程序会自动扫描其中的子文件夹,并在子文件夹列表中显示,方便后续设置排除项。

3. 设置文件类型

在"文件类型设置"区域,你可以精确控制需要处理的文件类型:

默认配置 程序内置了20多种常见文件类型的分类规则,默认情况下所有类型都是选中的。你可以直接使用默认配置进行分类,也可以根据需要进行调整。

选择特定类型

  • 勾选特定文件类型复选框:只处理选中的类型
  • 取消勾选特定文件类型复选框:跳过该类型的文件
  • 点击"全选"按钮:选中所有文件类型
  • 点击"取消全选"按钮:取消所有类型的选中状态

自定义文件类型 如果内置的文件类型不能满足你的需求,可以点击"自定义类型"按钮打开自定义对话框。在对话框中可以:

  • 添加新的文件类型,指定名称和扩展名列表
  • 编辑现有文件类型,修改名称或扩展名
  • 删除不需要的文件类型

4. 设置排除项(可选)

在"子文件夹设置"区域,你可以设置需要排除的子文件夹。程序会跳过这些子文件夹中的所有文件,不进行任何处理。

使用场景

  • 排除包含重要资料的子文件夹
  • 排除系统文件夹或隐藏文件夹
  • 排除已经整理好的子文件夹

操作方法 在子文件夹列表中,点击需要排除的文件夹使其处于选中状态即可。被选中的文件夹会在分类时被跳过。

5. 开始分类

完成上述设置后,点击"开始分类"按钮启动分类过程:

确认对话框 点击按钮后,程序会显示确认对话框,汇总本次分类的设置:

  • 目标文件夹名称
  • 将处理的文件类型数量
  • 将排除的子文件夹数量

确认无误后点击"是"继续,点击"否"可以返回修改设置。

分类过程 分类过程中,程序会:

  • 在后台线程中处理文件,避免界面卡顿
  • 实时显示分类进度
  • 自动创建分类文件夹
  • 处理同名文件冲突

分类完成 分类完成后,程序会:

  • 在状态栏显示分类结果统计
  • 在统计报告面板显示详细的分类信息
  • 保持"开始分类"按钮可用,便于再次使用

6. 查看统计报告

分类完成后,统计报告面板会显示详细的分类结果:

统计摘要

  • 总处理文件数
  • 成功分类文件数
  • 失败文件数(如有)

分类详情

  • 每个文件类型的分类数量
  • 文件类型占比图表
  • 可展开查看具体文件列表

统计报告让你对分类结果一目了然,便于后续检查和处理。

实际效果对比

使用本工具前后的对比如下(以下载目录为例):

分类前

Downloads/
├── 文件1.pdf
├── 照片.jpg
├── 安装包.exe
├── 文档.docx
├── 截图.png
├── 压缩包.zip
├── 表格.xlsx
├── 贺卡.psd
├── 视频.mp4
├── 小说.txt
└── ... (50+个文件混杂在一起)

分类后

Downloads/
├── PDF文档/
│   └── 文件1.pdf
├── 图片/
│   ├── 照片.jpg
│   └── 截图.png
├── 可执行文件/
│   └── 安装包.exe
├── Word文档/
│   └── 文档.docx
├── 压缩包/
│   └── 压缩包.zip
├── Excel表格/
│   └── 表格.xlsx
├── PS文件/
│   └── 贺卡.psd
├── 视频/
│   └── 视频.mp4
├── 文本文件/
│   └── 小说.txt
└── ... (按类型归类,查找方便)

可以看到,分类后的文件夹结构清晰明了,每个文件都位于对应的分类文件夹中,查找特定类型的文件只需打开相应的文件夹即可,效率大幅提升。

项目架构

这个项目采用模块化设计,将功能分解为不同的模块,提高代码的可维护性和可读性。

主要模块

  • file_sorter.py:主程序入口,负责创建GUI界面和处理用户交互,是整个应用的入口点
  • utils.py:工具模块,包含常量定义(如默认文件类型、主题颜色等)和通用工具函数
  • file_operations.py:文件操作模块,实现文件分类、移动等核心功能,是应用的业务逻辑核心
  • file_type_dialog.py:文件类型对话框模块,提供自定义文件类型的界面和交互逻辑

设计亮点

本项目在设计上注重实用性和可维护性,主要亮点包括:

后台线程处理 文件分类是IO密集型操作,如果放在主线程中执行,会导致界面卡顿。本项目使用QThread将分类操作放在后台线程中执行,界面始终保持响应,用户体验流畅。

主题自动切换 程序支持浅色/深色主题,并可以设置为跟随系统主题。当系统主题发生变化时,程序会自动切换对应的主题颜色,无需手动操作。

多语言支持 程序内置了完整的中英文支持,界面语言会根据系统设置自动切换。语言切换即时生效,无需重启应用。

统计报告功能 分类完成后,程序会生成详细的统计报告,让用户清楚地了解分类结果。统计信息包括处理文件数、各类型文件数量等。

技术实现详解

文件分类算法

文件分类的核心逻辑在file_operations.py模块中实现,采用高效的遍历和处理策略:

def sort_files_by_extension(folder_path, selected_types, file_types, excluded_folders=None):
    """
    对指定文件夹中的文件进行智能分类
    
    参数:
        folder_path: 要分类的文件夹路径
        selected_types: 要处理的文件类型列表
        file_types: 文件类型定义字典
        excluded_folders: 要排除的子文件夹列表
    
    返回:
        tuple: (成功处理文件数, 处理失败文件数)
    """
    if excluded_folders is None:
        excluded_folders = []
    
    success_count = 0
    error_count = 0
    
    # 遍历文件夹(包括子文件夹)
    for root, dirs, files in os.walk(folder_path):
        # 排除指定的子文件夹
        dirs[:] = [d for d in dirs if d not in excluded_folders]
        
        for filename in files:
            try:
                # 获取文件扩展名
                file_ext = os.path.splitext(filename)[1].lower()
                
                # 查找对应的文件类型
                file_type = find_file_type(file_ext, file_types)
                
                # 如果文件类型在选中列表中,则进行分类
                if file_type and file_type in selected_types:
                    # 准备源文件和目标路径
                    src_path = os.path.join(root, filename)
                    dest_folder = os.path.join(folder_path, file_type)
                    dest_path = os.path.join(dest_folder, filename)
                    
                    # 创建分类文件夹
                    if not os.path.exists(dest_folder):
                        os.makedirs(dest_folder)
                    
                    # 处理同名文件冲突
                    dest_path = handle_file_conflict(dest_path)
                    
                    # 移动文件
                    shutil.move(src_path, dest_path)
                    success_count += 1
                    
            except Exception as e:
                print(f"处理文件 {filename} 时出错: {e}")
                error_count += 1
    
    return success_count, error_count

这段代码展示了文件分类的核心流程:

  1. 遍历文件夹:使用os.walk递归遍历目标文件夹及其子文件夹
  2. 排除子文件夹:根据设置排除不需要处理的子文件夹
  3. 获取扩展名:使用os.path.splitext获取文件扩展名
  4. 查找类型:根据扩展名在文件类型定义中查找对应的分类
  5. 创建文件夹:如果分类文件夹不存在则创建
  6. 处理冲突:同名文件自动添加数字后缀避免覆盖
  7. 移动文件:使用shutil.move移动文件到目标位置

GUI界面实现

GUI界面使用PyQt5实现,采用现代化的设计风格:

class FileSorterApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("文件智能分类工具")
        self.setGeometry(300, 150, 700, 750)
        self.setAcceptDrops(True)  # 启用拖放功能
        
        # 初始化主题
        self.current_theme = "system"
        self.update_theme_colors()
        
        # 初始化菜单
        self.init_menu()
        
        # 初始化UI
        self.init_ui()
        
        # 设置主题检测定时器
        self.setup_theme_timer()
    
    def init_ui(self):
        """初始化用户界面"""
        # 创建主窗口部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout(central_widget)
        main_layout.setSpacing(15)
        
        # 创建标题
        title_label = QLabel("文件智能分类工具")
        title_label.setFont(QFont("微软雅黑", 16, QFont.Bold))
        main_layout.addWidget(title_label)
        
        # 创建拖放区域
        drop_zone = self.create_drop_zone(main_layout)
        drop_zone.mousePressEvent = self.handle_drop_zone_click
        
        # 创建文件夹选择区域
        self.create_folder_selection(main_layout)
        
        # 创建设置区域
        self.create_settings_area(main_layout)
        
        # 创建统计报告面板
        self.create_stats_report_panel(main_layout)
        
        # 创建开始分类按钮
        self.create_sort_button(main_layout)

这段代码展示了界面的初始化流程:

  1. 创建主窗口部件和垂直布局
  2. 添加标题标签
  3. 创建拖放区域,支持文件夹拖放
  4. 创建文件夹选择区域
  5. 创建文件类型和子文件夹设置区域
  6. 创建统计报告面板
  7. 创建开始分类按钮

拖放功能实现

拖放功能通过重写PyQt5的拖放事件处理函数实现:

def dragEnterEvent(self, event: QDragEnterEvent):
    """处理拖入事件"""
    if event.mimeData().hasUrls():
        # 接受包含URL的拖放事件
        event.acceptProposedAction()

def dropEvent(self, event: QDropEvent):
    """处理拖放事件"""
    mime_data: QMimeData = event.mimeData()
    if mime_data.hasUrls():
        # 获取第一个URL(通常是文件夹路径)
        url = mime_data.urls()[0]
        folder_path = url.toLocalFile()
        
        # 验证是否为文件夹
        if os.path.isdir(folder_path):
            self.set_selected_folder(folder_path)

这段代码实现了:

  1. dragEnterEvent:当用户拖入文件时,检查是否包含URL,如果是则接受事件,显示可放置的光标
  2. dropEvent:当用户释放鼠标时,获取拖入的文件夹路径并设置为目标文件夹

主题切换实现

主题切换功能支持手动选择和系统自动检测:

def switch_theme(self, theme_name):
    """
    切换应用主题
    
    参数:
        theme_name: 主题名称,支持"light"、"dark"和"system"
    """
    self.current_theme = theme_name
    theme = THEME_COLORS[theme_name]
    
    # 更新主题颜色变量
    self.primary_color = theme['primary']
    self.secondary_color = theme['secondary']
    self.accent_color = theme['accent']
    self.text_color = theme['text']
    self.background_color = theme['background']
    self.card_color = theme['card']
    
    # 应用新主题到所有UI元素
    self.apply_theme_to_ui()

def setup_theme_timer(self):
    """设置主题检测定时器"""
    from PyQt5.QtCore import QTimer
    self.theme_timer = QTimer(self)
    self.theme_timer.setInterval(500)  # 每500毫秒检查一次
    self.theme_timer.timeout.connect(self.check_system_theme_change)
    self.theme_timer.start()

def check_system_theme_change(self):
    """检查系统主题是否变化"""
    if self.current_theme == "system":
        current_theme = detect_system_theme()
        if current_theme != self.previous_system_theme:
            self.previous_system_theme = current_theme
            self.update_theme_colors()
            self.apply_theme_to_ui()

这段代码实现了:

  1. switch_theme:切换应用主题,更新颜色变量并应用到所有UI元素
  2. setup_theme_timer:设置定时器定期检查系统主题
  3. check_system_theme_change:当系统主题变化时自动更新应用主题

文件类型分类规则

本工具内置了丰富的文件类型分类规则,覆盖日常工作和生活中常见的大部分文件类型:

文档类型

  • PDF文档:.pdf
  • Word文档:.doc, .docx
  • Excel表格:.xls, .xlsx
  • PowerPoint演示文稿:.ppt, .pptx
  • 文本文件:.txt, .md, .json, .xml, .csv
  • 富文本格式:.rtf

图片类型

  • 位图格式:.jpg, .jpeg, .png, .gif, .bmp, .ico, .webp
  • 矢量图格式:.svg, .ai
  • 设计源文件:.psd, .xd, .sketch

音频类型

  • 常见音频:.mp3, .wav, .flac, .aac, .ogg, .wma

视频类型

  • 常见视频:.mp4, .avi, .mov, .mkv, .flv, .wmv, .webm

代码类型

  • 编程语言:.py, .java, .cpp, .c, .h, .js, .ts, .go, .rs
  • Web相关:.html, .css, .scss, .less
  • 脚本文件:.sh, .bat, .ps1
  • 配置文件:.ini, .conf, .yaml, .yml

归档类型

  • 压缩格式:.zip, .rar, .7z, .tar, .gz, .bz2

可执行文件

  • Windows程序:.exe, .msi
  • 安装包:.dmg(macOS), .deb(Linux), .rpm(Linux)

你可以通过"自定义类型"功能添加更多文件类型,满足个性化分类需求。

常见问题解答

Q1:分类会删除原文件吗? A:不会。分类操作是将文件移动到分类文件夹中,而不是复制或删除。原文件会保留在新的分类位置。

Q2:同名文件如何处理? A:程序会自动处理同名文件冲突。如果目标位置已存在同名文件,程序会在文件名后添加数字后缀(如 文件_1.pdf文件_2.pdf)来区分。

Q3:可以撤销分类操作吗? A:目前版本不支持直接撤销。建议在分类前备份重要文件,或先在不重要的文件夹上测试。

Q4:会处理隐藏文件夹吗? A:默认情况下,分类操作会处理所有文件,包括隐藏文件。如需排除,可以在设置中排除特定子文件夹。

Q5:支持批量处理多个文件夹吗? A:当前版本一次只能处理一个文件夹。如需处理多个文件夹,建议分次进行。

Q6:分类速度如何? A:分类速度取决于文件数量和硬盘性能。在普通机械硬盘上,每秒可处理数百个文件。对于包含数万文件的大文件夹,分类过程可能需要几分钟时间。

Q7:程序会崩溃吗? A:程序经过测试,具有良好的稳定性。但处理大量文件时,建议保持电脑连接电源,避免因电源管理导致异常。

扩展与定制

本项目采用模块化设计,方便进行功能扩展和定制:

添加新的文件类型utils.py文件中,修改DEFAULT_FILE_TYPES字典即可添加新的文件类型分类:

DEFAULT_FILE_TYPES = {
    # 现有分类...
    "新的分类名称": [".ext1", ".ext2", ".ext3"],  # 添加新的文件类型
}

修改界面样式utils.py文件中,修改THEME_COLORS字典可以自定义主题颜色:

THEME_COLORS = {
    "light": {
        "primary": "#your_primary_color",
        "secondary": "#your_secondary_color",
        # 其他颜色...
    },
    "dark": {
        # 深色主题配置...
    }
}

添加新语言支持languages.json文件中添加新的语言配置,然后在utils.py中加载即可支持新语言。

打包与分发

本项目支持将应用程序打包为可执行文件,方便在没有Python环境的电脑上运行:

Windows平台打包

# 安装PyInstaller
pip install pyinstaller

# 打包应用程序
python build_windows.py

打包完成后,会在dist文件夹中生成可执行文件,可以直接运行。

macOS平台打包

# 使用build_mac.py脚本打包
python build_mac.py

# 或使用build_mac.sh脚本
chmod +x build_mac.sh
./build_mac.sh

项目地址

欢迎Star、Fork和贡献代码!