如何利用python实现文件的自动整理归档(附Python代码)

如需要源码,关注微信公众号【爱敲代码的破晓】,后台私信【20260108】

电脑使用久了以后,Download路径下会正在大量的文件,需要不断的手动整理,费时费力。

为此,我利用Python编写了一个脚本实现了文件的自动化整理

废话不多说,直接上代码:

1.导入第三方库

import os
import shutil
import datetime
from pathlib import Path

2.定义需要整理的文件格式

# 文件类型分类字典
self.file_categories = {
    '图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.ico', '.webp', '.svg'],
    '视频': ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv', '.webm', '.m4v', '.mpg', '.mpeg'],
    '文档': ['.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.odt', '.ods', '.odp'],
    '压缩文件': ['.zip', '.rar', '.7z', '.tar', '.gz', '.bz2', '.xz', '.tgz'],
    '音乐': ['.mp3', '.wav', '.flac', '.aac', '.ogg', '.wma', '.m4a'],
    '文本': ['.txt', '.md', '.rtf', '.csv', '.json', '.xml', '.yaml', '.yml'],
    'PDF文件': ['.pdf'],
    '安装包': ['.exe', '.msi', '.dmg', '.pkg', '.deb', '.rpm', '.apk'],
    '电子书': ['.epub', '.mobi', '.azw3', '.fb2'],
    '脚本': ['.py', '.sh', '.bat', '.ps1', '.js', '.php', '.java', '.cpp', '.c', '.html', '.css']
}

大家可以更具自己的需求在这个字典里,添加文件格式或文件类型

然而,有时路径下的有些文件不应该被整理,如需系统文件或者配置文件。

3.定义需要排除的文件格式或文件名模式

# 需要排除的文件格式
self.excluded_extensions = [
    '.sys', '.dll', '.ini', '.cfg', '.config', '.log', '.tmp', '.temp',
    '.db', '.sqlite', '.lock', '.pid', '.swp', '.swo', '.DS_Store'
]

# 需要排除的特定文件名模式
self.excluded_patterns = [
    'desktop.ini', 'thumbs.db', '.gitignore', '.gitattributes',
    'package-lock.json', 'yarn.lock', 'requirements.txt'
]

同时,为了保证电脑运行不存问题,对于不上字典或需要排除的文件,我们对其不操作。

4.定义文件扩展名识别模块

def get_file_category(self, file_extension, filename):
    """
    根据文件扩展名确定文件类别

    Args:
        file_extension (str): 文件扩展名
        filename (str): 文件名

    Returns:
        str: 文件类别,如果不匹配则返回 None
    """
    # 检查是否在排除列表中
    if file_extension.lower() in self.excluded_extensions:
        return None

    # 检查是否匹配排除的文件名模式
    if filename.lower() in self.excluded_patterns:
        return None

    # 匹配文件类别
    for category, extensions in self.file_categories.items():
        if file_extension.lower() in extensions:
            return category

    return None

5.文件整理模块

def organize_files(self):
    """
    整理目标路径下的文件
    """
    print(f"开始整理路径: {self.target_path}")
    self.log_entries.append(f"文件整理开始时间: {datetime.datetime.now()}")
    self.log_entries.append(f"目标路径: {self.target_path}")

    # 统计信息
    stats = {
        'total': 0,
        'moved': 0,
        'skipped': 0,
        'categories': {category: 0 for category in self.file_categories.keys()}
    }

    try:
        # 遍历目标路径下的所有文件
        for item in self.target_path.iterdir():
            if item.is_file():  # 只处理文件,不处理文件夹
                stats['total'] += 1
                filename = item.name

                # 获取文件类别
                category = self.get_file_category(file_extension, filename)

                if category:
                    # 创建分类文件夹
                    category_folder = self.target_path / category
                    category_folder.mkdir(exist_ok=True)

                    # 构建目标文件路径
                    destination = category_folder / filename

                    # 处理同名文件
                    if destination.exists():
                        # 如果目标文件已存在,添加时间戳重命名
                        timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
                        name_without_ext = item.stem
                        new_filename = f"{name_without_ext}_{timestamp}{file_extension}"
                        destination = category_folder / new_filename

                    try:
                        # 移动文件
                        shutil.move(str(item), str(destination))
                        stats['moved'] += 1
                        stats['categories'][category] += 1

                        log_message = f"[移动] {filename} -> {category}/{destination.name}"
                        self.log_entries.append(log_message)
                        print(log_message)

                    except Exception as e:
                        error_message = f"[错误] 无法移动文件 {filename}: {str(e)}"
                        self.log_entries.append(error_message)
                        print(error_message)
                        stats['skipped'] += 1

                else:
                    # 不需要操作的文件
                    reason = "系统/排除文件" if (file_extension.lower() in self.excluded_extensions or 
                                              filename.lower() in self.excluded_patterns) else "未知文件类型"

                    log_message = f"[跳过] {filename} - 原因: {reason}"
                    self.log_entries.append(log_message)
                    print(log_message)
                    stats['skipped'] += 1

    except Exception as e:
        error_message = f"整理过程中发生错误: {str(e)}"
        self.log_entries.append(error_message)
        print(error_message)

    # 添加统计信息到日志
    self.log_entries.append("-" * 50)
    self.log_entries.append("整理统计:")
    self.log_entries.append(f"总文件数: {stats['total']}")
    self.log_entries.append(f"已移动文件数: {stats['moved']}")
    self.log_entries.append(f"跳过文件数: {stats['skipped']}")
    self.log_entries.append("")
    self.log_entries.append("按类别统计:")

    for category, count in stats['categories'].items():
        if count > 0:
            self.log_entries.append(f"  {category}: {count} 个文件")

    self.log_entries.append("")
    self.log_entries.append(f"文件整理结束时间: {datetime.datetime.now()}")

    # 保存日志文件
    self.save_log()

    print(f"\n整理完成! 日志已保存到: {self.log_file}")

    return stats

6.文件整理日志记录并保存

def save_log(self):
    """
    保存操作日志到txt文件
    """
    try:
        with open(self.log_file, 'w', encoding='utf-8') as f:
            for entry in self.log_entries:
                f.write(entry + '\n')
        print(f"日志文件已保存: {self.log_file}")
    except Exception as e:
        print(f"保存日志文件时出错: {str(e)}")

一下是运行完成后控制台输出结果:

图片

如需要数据及源码,关注微信公众号【爱敲代码的破晓】,后台私信【20260108】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值