Python文件管理自动化:整理、备份、批量处理的实战指南

📂 文章

你的下载文件夹是不是这样

打开下载文件夹,一片混乱:PDF和JPG混在一起,"新建文件夹(3)"套着"新建文件夹(4)",三个月前的文件找不到了。

Python可以帮你自动整理。核心用到三个模块:os(文件和目录操作)、shutil(文件复制移动)、pathlib(更现代的路径操作)。

场景一:自动分类整理文件

import os
import shutil
from pathlib import Path

def auto_organize(folder_path):
    """自动按文件类型分类整理"""
    
    # 文件类型映射
    type_map = {
        "文档": [".pdf", ".doc", ".docx", ".txt", ".md", ".xlsx", ".pptx"],
        "图片": [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".svg"],
        "视频": [".mp4", ".avi", ".mov", ".mkv", ".wmv"],
        "音频": [".mp3", ".wav", ".flac", ".aac"],
        "压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"],
        "代码": [".py", ".js", ".html", ".css", ".java", ".cpp"],
    }
    
    # 创建分类文件夹
    for folder_name in type_map:
        target_dir = os.path.join(folder_path, folder_name)
        os.makedirs(target_dir, exist_ok=True)
    
    # 遍历并移动文件
    organized = 0
    for filename in os.listdir(folder_path):
        file_path = os.path.join(folder_path, filename)
        
        # 跳过文件夹
        if os.path.isdir(file_path):
            continue
        
        # 获取扩展名
        ext = os.path.splitext(filename)[1].lower()
        
        # 找到对应分类
        moved = False
        for category, extensions in type_map.items():
            if ext in extensions:
                target = os.path.join(folder_path, category, filename)
                shutil.move(file_path, target)
                print(f"  {filename} → {category}/")
                organized += 1
                moved = True
                break
        
        if not moved:
            print(f"  {filename} → 其他/ (未识别类型)")
            other_dir = os.path.join(folder_path, "其他")
            os.makedirs(other_dir, exist_ok=True)
            shutil.move(file_path, os.path.join(other_dir, filename))
    
    print(f"\n整理完成!共处理 {organized} 个文件")

# 使用
auto_organize("C:/Users/你的用户名/Downloads")

场景二:按日期归档

import os
import shutil
from datetime import datetime

def organize_by_date(folder_path):
    """按文件修改日期归档到年/月文件夹"""
    
    for filename in os.listdir(folder_path):
        file_path = os.path.join(folder_path, filename)
        if os.path.isdir(file_path):
            continue
        
        # 获取修改时间
        mtime = os.path.getmtime(file_path)
        dt = datetime.fromtimestamp(mtime)
        
        # 创建年/月文件夹
        year_folder = str(dt.year)
        month_folder = f"{dt.month:02d}月"
        target_dir = os.path.join(folder_path, year_folder, month_folder)
        os.makedirs(target_dir, exist_ok=True)
        
        # 移动
        target = os.path.join(target_dir, filename)
        shutil.move(file_path, target)
        print(f"{filename} → {year_folder}/{month_folder}/")

场景三:批量修改文件名

import os
import re

def batch_rename(folder_path, pattern, replacement):
    """批量替换文件名中的文字"""
    
    count = 0
    for filename in os.listdir(folder_path):
        # 用正则替换文件名
        new_name = re.sub(pattern, replacement, filename)
        if new_name != filename:
            old_path = os.path.join(folder_path, filename)
            new_path = os.path.join(folder_path, new_name)
            os.rename(old_path, new_path)
            print(f"  {filename} → {new_name}")
            count += 1
    
    print(f"\n共重命名 {count} 个文件")

# 示例:去掉文件名中的"[副本]"
batch_rename("./文档", r"\[副本\]", "")

# 示例:把文件名中的空格换成下划线
batch_rename("./文档", r"\s+", "_")

场景四:自动备份重要文件

import os
import shutil
from datetime import datetime

def auto_backup(source_dir, backup_dir):
    """自动备份文件夹到指定位置"""
    
    # 创建带时间戳的备份文件夹
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    backup_name = f"backup_{timestamp}"
    target = os.path.join(backup_dir, backup_name)
    
    # 复制整个文件夹
    shutil.copytree(source_dir, target)
    
    # 统计
    total_files = 0
    total_size = 0
    for root, dirs, files in os.walk(target):
        total_files += len(files)
        for f in files:
            total_size += os.path.getsize(os.path.join(root, f))
    
    size_mb = total_size / (1024 * 1024)
    print(f"备份完成!")
    print(f"  位置:{target}")
    print(f"  文件数:{total_files}")
    print(f"  大小:{size_mb:.1f} MB")

# 使用:每天备份工作文档
auto_backup(
    "D:/工作文档",
    "E:/备份/工作文档备份"
)

进阶:清理过期文件

import os
import time

def clean_old_files(folder_path, days=30):
    """删除超过指定天数的文件"""
    
    cutoff = time.time() - (days * 86400)  # 30天前的时间戳
    deleted = 0
    
    for filename in os.listdir(folder_path):
        file_path = os.path.join(folder_path, filename)
        if os.path.isfile(file_path) and os.path.getatime(file_path) < cutoff:
            os.remove(file_path)
            print(f"  已删除:{filename}")
            deleted += 1
    
    print(f"\n清理完成,删除 {deleted} 个过期文件")

提醒:删除操作不可逆,建议先用print预览,确认无误后再执行os.remove。