Python shutil库使用指南

概述

shutil模块提供了许多高级的文件操作功能,特别是支持文件和目录的复制、移动和删除操作。它是Python标准库的一部分,通常与os模块配合使用。

文件和目录操作

复制文件

  • shutil.copyfile(src, dst):复制文件内容(不包含元数据)
  • shutil.copy(src, dst):复制文件内容和权限模式
  • shutil.copy2(src, dst):复制文件内容、权限模式和所有元数据

使用经验

  • 在需要保留文件元数据(如创建时间)时,优先使用copy2
  • 对于大文件复制,可以结合进度条显示:
from tqdm import tqdm

def copy_with_progress(src, dst):
    with open(src, 'rb') as fsrc:
        with open(dst, 'wb') as fdst:
            with tqdm(total=os.path.getsize(src), unit='B', unit_scale=True) as pbar:
                while True:
                    buf = fsrc.read(16*1024)
                    if not buf:
                        break
                    fdst.write(buf)
                    pbar.update(len(buf))

复制目录

  • shutil.copytree(src, dst):递归复制整个目录树

常见问题

  • 目标目录已存在时会报错,可以设置dirs_exist_ok=True
  • 忽略特定文件模式:
copytree('src', 'dst', 
         ignore=ignore_patterns('*.tmp', '.git*'))

删除目录

  • shutil.rmtree(path):递归删除目录树

注意事项

  • 删除操作不可逆,建议先备份重要数据
  • 在Windows上删除只读文件时可能会失败,可以添加错误处理:
def remove_readonly(func, path, _):
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(path, onexc=remove_readonly)

移动文件/目录

  • shutil.move(src, dst):移动文件或目录到新位置

使用技巧

  • 跨分区移动时,实际上是复制+删除操作
  • 对于大量小文件,建议先打包再移动

归档操作

shutil提供了创建和读取压缩归档文件的功能:

创建归档

  • shutil.make_archive(base_name, format, root_dir):创建归档文件
  • 支持的格式:zip, tar, gztar, bztar, xztar

性能优化

  • 对于大量小文件,先创建tar包再压缩比直接创建gztar更快
  • 多线程压缩大文件:
from concurrent.futures import ThreadPoolExecutor

def compress_file(file):
    shutil.make_archive(file, 'gztar', root_dir=file)

with ThreadPoolExecutor() as executor:
    executor.map(compress_file, large_files)

解压归档

  • shutil.unpack_archive(filename, extract_dir):解压归档文件

安全建议

  • 解压前检查压缩包内容,防止路径穿越攻击
  • 设置解压过滤器:
shutil.unpack_archive('archive.zip', 'extract_dir', filter='data')

实用工具

磁盘使用情况

  • shutil.disk_usage(path):获取指定路径的磁盘使用统计

使用场景

  • 在备份前检查目标磁盘空间
  • 监控磁盘使用情况,及时清理

查找可执行文件

  • shutil.which(cmd):查找可执行文件的路径

实用技巧

  • 检查程序依赖是否安装
  • 查找系统命令的完整路径

终端大小

  • shutil.get_terminal_size():获取终端窗口的大小

应用场景

  • 调整输出格式适应终端宽度
  • 创建自适应命令行界面

个人使用心得

  1. 备份策略
  • 使用copytree进行增量备份
  • 配合make_archive创建压缩备份
  • 定期清理旧备份
  1. 部署应用
  • 使用shutil部署Python包
  • 复制配置文件模板
  • 清理临时文件
  1. 性能优化
  • 大文件复制使用分块读写
  • 多线程处理多个文件
  • 使用快速复制系统调用(Python 3.8+)
  1. 错误处理
  • 添加详细的日志记录
  • 实现重试机制
  • 提供友好的错误提示