Python中如何实现一个整理文档的小工具?

电脑的下载目录总是被塞得很满,又不想去清理,于是写了个小工具进行日常整理,将文件按日期分类存放, github gist 链接: https://gist.github.com/preytaren/3983295d523f099615e5a5ff9233988f


Python中如何实现一个整理文档的小工具?
3 回复
import os
import shutil
from datetime import datetime
import mimetypes

class DocumentOrganizer:
    def __init__(self, source_dir, target_dir=None):
        """
        文档整理工具
        :param source_dir: 源目录路径
        :param target_dir: 目标目录路径(可选)
        """
        self.source_dir = os.path.abspath(source_dir)
        self.target_dir = target_dir or os.path.join(source_dir, "Organized_Docs")
        
        # 创建目标目录
        os.makedirs(self.target_dir, exist_ok=True)
        
        # 文件类型分类映射
        self.file_categories = {
            'images': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg'],
            'documents': ['.pdf', '.doc', '.docx', '.txt', '.md', '.rtf'],
            'spreadsheets': ['.xls', '.xlsx', '.csv'],
            'presentations': ['.ppt', '.pptx'],
            'archives': ['.zip', '.rar', '.7z', '.tar', '.gz'],
            'code': ['.py', '.js', '.html', '.css', '.java', '.cpp'],
            'audio': ['.mp3', '.wav', '.flac'],
            'video': ['.mp4', '.avi', '.mov', '.mkv']
        }
    
    def get_file_category(self, filename):
        """根据扩展名获取文件分类"""
        _, ext = os.path.splitext(filename)
        ext = ext.lower()
        
        for category, extensions in self.file_categories.items():
            if ext in extensions:
                return category
        return 'others'
    
    def organize_by_category(self):
        """按文件类型分类整理"""
        print(f"开始整理目录: {self.source_dir}")
        
        for item in os.listdir(self.source_dir):
            source_path = os.path.join(self.source_dir, item)
            
            # 跳过目录
            if os.path.isdir(source_path):
                continue
                
            # 获取文件分类
            category = self.get_file_category(item)
            category_dir = os.path.join(self.target_dir, category)
            
            # 创建分类目录
            os.makedirs(category_dir, exist_ok=True)
            
            # 构建目标路径
            target_path = os.path.join(category_dir, item)
            
            # 处理重名文件
            counter = 1
            while os.path.exists(target_path):
                name, ext = os.path.splitext(item)
                target_path = os.path.join(category_dir, f"{name}_{counter}{ext}")
                counter += 1
            
            # 移动文件
            shutil.move(source_path, target_path)
            print(f"已移动: {item} -> {category}/")
        
        print(f"整理完成!文件已保存到: {self.target_dir}")
    
    def organize_by_date(self, date_format="%Y-%m"):
        """按日期整理(按年月)"""
        print("按日期整理文件...")
        
        for item in os.listdir(self.source_dir):
            source_path = os.path.join(self.source_dir, item)
            
            if os.path.isdir(source_path):
                continue
                
            # 获取文件修改时间
            mtime = os.path.getmtime(source_path)
            date_str = datetime.fromtimestamp(mtime).strftime(date_format)
            
            # 创建日期目录
            date_dir = os.path.join(self.target_dir, date_str)
            os.makedirs(date_dir, exist_ok=True)
            
            # 移动文件
            target_path = os.path.join(date_dir, item)
            shutil.move(source_path, target_path)
            print(f"已按日期移动: {item} -> {date_str}/")
    
    def create_index_file(self):
        """创建索引文件"""
        index_path = os.path.join(self.target_dir, "index.txt")
        with open(index_path, 'w', encoding='utf-8') as f:
            f.write("文件整理索引\n")
            f.write("=" * 50 + "\n")
            
            for root, dirs, files in os.walk(self.target_dir):
                # 跳过索引文件本身
                if "index.txt" in files:
                    files.remove("index.txt")
                
                level = root.replace(self.target_dir, '').count(os.sep)
                indent = ' ' * 2 * level
                f.write(f"{indent}{os.path.basename(root)}/\n")
                
                sub_indent = ' ' * 2 * (level + 1)
                for file in files:
                    f.write(f"{sub_indent}{file}\n")
        
        print(f"索引文件已创建: {index_path}")


# 使用示例
if __name__ == "__main__":
    # 设置要整理的目录
    source_directory = "/path/to/your/documents"  # 修改为你的目录路径
    
    # 创建整理器实例
    organizer = DocumentOrganizer(source_directory)
    
    # 按类型整理
    organizer.organize_by_category()
    
    # 创建索引
    organizer.create_index_file()
    
    # 如果要按日期整理,取消下面注释
    # organizer.organize_by_date()

这个工具提供了两种整理方式:按文件类型分类和按修改日期整理。核心思路是遍历目录,根据文件扩展名或修改时间创建对应的子目录,然后移动文件。get_file_category()方法通过扩展名映射将文件分类,organize_by_category()执行分类整理,organize_by_date()按年月整理。使用前记得修改source_directory为你的实际路径。

用之前先备份重要文件。


好玩~不过感觉按照月份就够了,不然我要找的话,得思考一下是 7.17 号下载的还是 7.16 号下载的…

完全没法运行啊

回到顶部