为什么选择shutil模块?

shutil是Python标准库中用于高级文件操作的模块,提供了比os模块更简单的文件复制、移动、删除和归档操作接口。

shutil模块核心方法

复制文件 - copy()

复制单个文件到目标位置,保留文件权限但不保留元数据。

shutil.copy(src, dst, *, follow_symlinks=True)
import shutil

# 复制文件到目标目录
shutil.copy('source.txt', 'backup/')

# 复制文件并重命名
shutil.copy('report.docx', 'backup/report_backup.docx')
复制文件及元数据 - copy2()

类似于copy(),但会保留文件的所有元数据(包括创建时间、修改时间等)。

shutil.copy2(src, dst, *, follow_symlinks=True)
import shutil

# 复制文件并保留元数据
shutil.copy2('original.jpg', 'backup/original_backup.jpg')
复制目录 - copytree()

递归复制整个目录树,包括所有子目录和文件。

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)
import shutil

# 复制整个目录
shutil.copytree('project/', 'project_backup/')

# 复制时忽略特定文件
def ignore_pycache(dir, names):
    return [name for name in names if name == '__pycache__']

shutil.copytree('src/', 'src_backup/', ignore=ignore_pycache)
移动文件/目录 - move()

将文件或目录移动到新位置,也可用于重命名操作。

shutil.move(src, dst, copy_function=copy2)
import shutil

# 移动文件到新位置
shutil.move('old_location/data.csv', 'new_location/')

# 重命名文件
shutil.move('old_name.txt', 'new_name.txt')
删除目录树 - rmtree()

递归删除整个目录树(包括子目录和文件),类似于rm -rf命令。

shutil.rmtree(path, ignore_errors=False, onerror=None)
import shutil

# 删除整个目录
shutil.rmtree('temp_files/')

# 安全删除,忽略错误
shutil.rmtree('cache/', ignore_errors=True)
注意: 使用rmtree()要格外小心,因为它会永久删除目录及其所有内容。
磁盘空间查询 - disk_usage()

查询磁盘使用情况,返回总空间、已用空间和可用空间(字节)。

shutil.disk_usage(path)
import shutil

# 获取当前目录磁盘使用情况
usage = shutil.disk_usage('.')
print(f"总空间: {usage.total / (1024**3):.2f} GB")
print(f"已用空间: {usage.used / (1024**3):.2f} GB")
print(f"可用空间: {usage.free / (1024**3):.2f} GB")

高级文件操作

shutil与os模块对比

操作类型 shutil方法 os模块方法 优势
复制文件 copy()/copy2() 需要open+read+write组合 代码更简洁,支持元数据
复制目录 copytree() 需要递归实现 一行代码完成复杂操作
删除目录树 rmtree() 需要递归删除 安全高效,错误处理完善
移动文件 move() os.rename() 跨文件系统支持

实际应用场景

📁 项目备份工具

使用copytree()创建项目完整备份,排除临时文件和缓存目录:

import shutil
from datetime import datetime

def backup_project(project_path, backup_dir):
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    backup_path = f"{backup_dir}/project_{timestamp}"
    
    ignore = shutil.ignore_patterns('*.tmp', '__pycache__', '.cache')
    shutil.copytree(project_path, backup_path, ignore=ignore)
    
    print(f"项目已备份到: {backup_path}")

🗑️ 清理临时文件

使用rmtree()安全清理临时目录:

import shutil
import os

def clean_temp_dirs(temp_dirs):
    for dir_path in temp_dirs:
        if os.path.exists(dir_path):
            try:
                shutil.rmtree(dir_path)
                print(f"已清理: {dir_path}")
            except Exception as e:
                print(f"清理失败 {dir_path}: {e}")

💾 磁盘空间监控

使用disk_usage()监控磁盘空间并发出警报:

import shutil

def check_disk_space(path, threshold_gb=5):
    usage = shutil.disk_usage(path)
    free_gb = usage.free / (1024 ** 3)
    
    if free_gb < threshold_gb:
        print(f"警告: {path} 仅剩 {free_gb:.1f} GB 空间!")
        # 发送警报邮件或通知
        return False
    return True

总结

shutil模块是Python中处理文件和目录的强大工具,它提供的高级操作可以大大简化文件管理任务:

  • 使用copy/copy2进行文件复制操作
  • 使用copytree复制整个目录结构
  • 使用move进行文件/目录移动和重命名
  • 使用rmtree安全删除目录树
  • 使用disk_usage监控磁盘空间

掌握shutil模块能显著提高文件操作代码的效率与可读性,是每个Python开发者必备的工具集。