如何编写批量文件归类脚本

wen 实用脚本 3

本文目录导读:

如何编写批量文件归类脚本

  1. 基础版本 - 按文件类型归类
  2. 高级版本 - 多功能归类脚本
  3. 脚本使用说明

我来提供一个功能完整的批量文件归类脚本,这个脚本可以根据文件类型、日期、关键词等规则自动整理文件。

基础版本 - 按文件类型归类

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
批量文件归类脚本 - 按文件类型
"""
import os
import shutil
from pathlib import Path
# 文件类型分类规则
FILE_CATEGORIES = {
    '图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg', '.webp', '.ico'],
    '视频': ['.mp4', '.avi', '.mkv', '.mov', '.wmv', '.flv', '.webm'],
    '音频': ['.mp3', '.wav', '.flac', '.aac', '.ogg', '.m4a'],
    '文档': ['.pdf', '.doc', '.docx', '.txt', '.md', '.ppt', '.pptx', '.xls', '.xlsx'],
    '压缩包': ['.zip', '.rar', '.7z', '.tar', '.gz', '.bz2'],
    '代码': ['.py', '.js', '.html', '.css', '.java', '.cpp', '.c', '.php', '.json', '.xml'],
    '安装包': ['.exe', '.msi', '.dmg', '.pkg', '.deb', '.rpm'],
    '其他': []  # 默认归类的类型
}
def organize_files(source_dir, target_dir=None):
    """
    按文件类型整理文件
    Args:
        source_dir: 源文件夹路径
        target_dir: 目标文件夹路径(默认使用源文件夹)
    """
    source_path = Path(source_dir)
    target_path = Path(target_dir) if target_dir else source_path
    if not source_path.exists():
        print(f"错误:源文件夹 {source_dir} 不存在")
        return
    # 统计信息
    stats = {"moved": 0, "failed": 0}
    # 遍历源文件夹中的所有文件
    for item in source_path.iterdir():
        if item.is_file():
            # 获取文件扩展名
            file_ext = item.suffix.lower()
            # 确定文件类别
            category = "其他"
            for cat, extensions in FILE_CATEGORIES.items():
                if file_ext in extensions:
                    category = cat
                    break
            # 创建目标文件夹
            category_dir = target_path / category
            category_dir.mkdir(exist_ok=True)
            # 移动文件
            try:
                dest_path = category_dir / item.name
                # 处理重名文件
                if dest_path.exists():
                    base_name = item.stem
                    counter = 1
                    while dest_path.exists():
                        dest_path = category_dir / f"{base_name}_{counter}{file_ext}"
                        counter += 1
                shutil.move(str(item), str(dest_path))
                print(f"✓ 移动: {item.name} -> {category}/")
                stats["moved"] += 1
            except Exception as e:
                print(f"✗ 失败: {item.name} - {str(e)}")
                stats["failed"] += 1
    # 打印统计信息
    print("\n" + "="*50)
    print(f"文件归类完成!")
    print(f"成功移动: {stats['moved']} 个文件")
    print(f"失败: {stats['failed']} 个文件")
    print("="*50)
# 使用示例
if __name__ == "__main__":
    # 指定要整理的文件夹
    source_folder = input("请输入要整理的文件夹路径: ").strip()
    # 可选择是否指定目标文件夹
    target_folder = input("请输入目标文件夹路径(直接回车使用原文件夹): ").strip()
    organize_files(source_folder, target_folder if target_folder else None)

高级版本 - 多功能归类脚本

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
高级批量文件归类脚本
支持按类型、日期、关键词、大小等多种方式整理
"""
import os
import shutil
from pathlib import Path
from datetime import datetime
import re
import json
import logging
# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('file_organizer.log', encoding='utf-8'),
        logging.StreamHandler()
    ]
)
class FileOrganizer:
    """文件归类管理器"""
    def __init__(self, source_dir):
        self.source_dir = Path(source_dir)
        self.logger = logging.getLogger(__name__)
        self.stats = {"moved": 0, "failed": 0, "skipped": 0}
        # 配置文件规则
        self.rules = {
            "image_extensions": ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg'],
            "video_extensions": ['.mp4', '.avi', '.mkv', '.mov', '.wmv'],
            "document_extensions": ['.pdf', '.doc', '.docx', '.txt', '.xlsx', '.pptx'],
            "archive_extensions": ['.zip', '.rar', '.7z', '.tar', '.gz'],
            "code_extensions": ['.py', '.js', '.html', '.css', '.java', '.cpp']
        }
    def organize_by_type(self, target_dir=None):
        """按文件类型整理"""
        target = Path(target_dir) if target_dir else self.source_dir
        self.logger.info("开始按类型整理文件...")
        for file_path in self.source_dir.iterdir():
            if file_path.is_file():
                category = self._get_file_type(file_path)
                self._move_file(file_path, target / category)
        self._print_summary("按类型整理")
    def organize_by_date(self, target_dir=None):
        """按文件修改日期整理(年/月)"""
        target = Path(target_dir) if target_dir else self.source_dir
        self.logger.info("开始按日期整理文件...")
        for file_path in self.source_dir.iterdir():
            if file_path.is_file():
                mtime = datetime.fromtimestamp(file_path.stat().st_mtime)
                date_dir = target / str(mtime.year) / f"{mtime.month:02d}月"
                self._move_file(file_path, date_dir)
        self._print_summary("按日期整理")
    def organize_by_keywords(self, keyword_mapping, target_dir=None):
        """
        按关键词整理文件
        Args:
            keyword_mapping: 如 {"工作": ["报告", "项目", "会议"]}
            target_dir: 目标文件夹
        """
        target = Path(target_dir) if target_dir else self.source_dir
        self.logger.info("开始按关键词整理文件...")
        # 添加到"其他"类别
        keyword_mapping.setdefault("其他", [])
        for file_path in self.source_dir.iterdir():
            if file_path.is_file():
                matched = False
                for folder_name, keywords in keyword_mapping.items():
                    if any(keyword.lower() in file_path.stem.lower() 
                           for keyword in keywords):
                        self._move_file(file_path, target / folder_name)
                        matched = True
                        break
                # 未匹配的文件放到"其他"
                if not matched:
                    self._move_file(file_path, target / "其他")
        self._print_summary("按关键词整理")
    def organize_by_size(self, size_thresholds, target_dir=None):
        """
        按文件大小整理
        Args:
            size_thresholds: 如 {"小文件(<1MB)": 1048576, "中等(1-10MB)": 10485760}
            target_dir: 目标文件夹
        """
        target = Path(target_dir) if target_dir else self.source_dir
        self.logger.info("开始按大小整理文件...")
        for file_path in self.source_dir.iterdir():
            if file_path.is_file():
                size = file_path.stat().st_size
                category = "超大文件"
                for folder_name, threshold in size_thresholds.items():
                    if size <= threshold:
                        category = folder_name
                        break
                self._move_file(file_path, target / category)
        self._print_summary("按大小整理")
    def _get_file_type(self, file_path):
        """获取文件类型"""
        ext = file_path.suffix.lower()
        for category, extensions in self.rules.items():
            if ext in extensions:
                category = category.replace("_extensions", "").capitalize()
                return category
        return "其他"
    def _move_file(self, file_path, dest_dir):
        """移动文件到目标目录"""
        try:
            # 创建目标目录
            dest_dir.mkdir(parents=True, exist_ok=True)
            # 处理重名文件
            dest_path = dest_dir / file_path.name
            if dest_path.exists():
                base_name = file_path.stem
                counter = 1
                while dest_path.exists():
                    new_name = f"{base_name}_{counter}{file_path.suffix}"
                    dest_path = dest_dir / new_name
                    counter += 1
            # 移动文件
            shutil.move(str(file_path), str(dest_path))
            self.stats["moved"] += 1
            self.logger.info(f"移动: {file_path.name} -> {dest_dir.name}/")
        except Exception as e:
            self.stats["failed"] += 1
            self.logger.error(f"移动失败: {file_path.name} - {str(e)}")
    def _print_summary(self, mode):
        """打印统计摘要"""
        summary = f"""
╔══════════════════════════════════════╗
║        文件归类完成报告               ║
╠══════════════════════════════════════╣
║ 整理方式: {mode.ljust(20)}║
║ 成功移动: {str(self.stats["moved"]).ljust(19)}║
║ 失败文件: {str(self.stats["failed"]).ljust(19)}║
╚══════════════════════════════════════╝
"""
        print(summary)
        self.logger.info(f"归类完成: 移动{self.stats['moved']}个, 失败{self.stats['failed']}个")
# 使用示例
def run_example():
    """运行示例"""
    folder = input("请输入要整理的文件夹路径: ").strip()
    while True:
        print("\n请选择整理方式:")
        print("1. 按文件类型整理")
        print("2. 按日期整理")
        print("3. 按关键词整理")
        print("4. 按大小整理")
        print("5. 退出")
        choice = input("请输入选项(1-5): ")
        if choice == "1":
            FileOrganizer(folder).organize_by_type()
        elif choice == "2":
            FileOrganizer(folder).organize_by_date()
        elif choice == "3":
            # 自定义关键词规则
            rules = {
                "工作": ["报告", "项目", "会议"], 
                "学习": ["笔记", "教程", "课件"],
                "生活": ["照片", "旅行"],
                "其他": []
            }
            FileOrganizer(folder).organize_by_keywords(rules)
        elif choice == "4":
            # 自定义大小规则 (字节)
            size_rules = {
                "小文件(<1MB)": 1048576,
                "中等(1-10MB)": 10485760,
                "大文件(10-100MB)": 104857600,
                "超大文件(>100MB)": float('inf')
            }
            FileOrganizer(folder).organize_by_size(size_rules)
        elif choice == "5":
            print("再见!")
            break
        else:
            print("无效选项,请重新输入")
if __name__ == "__main__":
    run_example()

脚本使用说明

安装依赖

# 如果没有安装需要
pip install pathlib  # Python 3.4+ 自带

使用方法

  1. 基础使用

    python file_organizer.py
  2. 自定义规则:修改脚本中的规则配置

folder/
├── 图片/          # .jpg, .png 等
├── 视频/          # .mp4, .avi 等
├── 文档/          # .pdf, .doc 等
├── 代码/          # .py, .js 等
└── 其他/          # 未分类文件

安全提示

  1. 备份重要文件:首次使用建议在测试文件夹中运行
  2. 权限问题:确保有读写权限
  3. 路径格式:Windows使用C:\path,Linux/Mac使用/path

这个脚本支持多种归类和自定义规则,可以根据需求调整,需要我添加其他功能吗?

抱歉,评论功能暂时关闭!