Python3 shutil 模块及应用

🎉摘要:本文详解 Python 内置 shutil 模块的高级文件操作,弥补 os 模块不足。涵盖文件目录复制、移动、删除、压缩解压及权限修改等方法,提供完整代码示例与自动备份实战教程,助您高效处理文件任务。

shutil 全称 shell utility(shell 工具),是 Python 内置的文件 / 目录高级操作模块,专门用于处理文件复制、文件移动、文件删除、文件压缩、文件权限修改等操作,弥补了内置 os 模块在文件操作上的不足。

shutil 主要方法

文件/目录复制

使用如下方法实现文件目录的复制:

  • shutil.copy(src, dst)   用于普通文件复制,会保留权限,不保留元数据。

  • shutil.copy2(src, dst)   用于复制文件,会保留权限 + 创建 / 修改时间。

  • shutil.copyfile(src, dst)   用于只需要文件数据,不需要属性,不保留权限。

  • shutil.copytree(src, dst)   用于递归复制整个目录树,如复制文件夹(包含子文件夹 / 文件)。

示例:

import shutil
import os

# 准备测试文件
with open("test.txt", "w", encoding="utf-8") as f:
    f.write("shutil 模块测试内容")

# copyfile:仅复制内容(目标必须是文件名,不能是目录)
shutil.copyfile("test.txt", "test_copy1.txt")
print("copyfile 完成")

# copy:复制文件+权限(目标可以是目录/文件名)
shutil.copy("test.txt", "test_copy2.txt")
print("copy 完成")

# copy2:复制文件+权限+创建/修改时间(推荐)
shutil.copy2("test.txt", "test_copy3.txt")
print("copy2 完成")

# copytree:递归复制整个目录(目标目录必须不存在)
os.mkdir("test_dir")  # 创建源目录
shutil.copy("test.txt", "test_dir/test.txt")
shutil.copytree("test_dir", "test_dir_copy")  # 复制整个目录
print("copytree 完成")

运行结果:

copyfile 完成
copy 完成
copy2 完成
copytree 完成

文件目录移动和重命名

shutil 中,使用 move 方法实现文件和目录的移动与重命名,如下:

  • shutil.move(src, dst)   移动文件 / 目录,也可用于重命名,src 表示源文件和目录,dst 表示目标文件和目录。

示例:

import shutil
import os

# 准备测试文件
with open("test.txt", "w", encoding="utf-8") as f:
    f.write("shutil 模块测试内容")

# 重命名文件
shutil.move("test.txt", "test_rename.txt")
print("rename 操作完成")

# 移动文件到目录
os.mkdir("test_dir")  # 创建目标目录
shutil.move("test_rename.txt", "test_dir")
print("move 文件到目录操作完成")

# 移动整个目录
shutil.move("test_dir", "test_dir_move")
print("move 目录操作完成")

执行结果:

rename 操作完成
move 文件到目录操作完成
move 目录操作完成

目录删除(高危操作)

请谨记,目录删除是一个高危操作,要谨慎使用。

在 shutil 中,可以使用 rmtree() 方法递归删除非空目录,包含目录下面的所有子文件 / 子目录。方法定义如下:

  • shutil.rmtree(path)  path 为目录路径

注意:os.rmdir() 只能删除空目录,shutil.rmtree() 可以删除任何非空目录。

示例:

import shutil
import os

# 准备工作
# test_dir_move
#   |—— test_dir
#          |—— test.txt
# 准备测试文件
with open("test.txt", "w", encoding="utf-8") as f:
    f.write("shutil 模块测试内容")
    
os.mkdir("test_dir")  # 创建目标目录
shutil.move("test.txt", "test_dir") # 移动文件到目标目录
shutil.move("test_dir", "test_dir_move") # 移动目录到目标目录


# 删除整个目录(包含里面所有内容)
shutil.rmtree("test_dir_move")
print("rmtree 删除非空目录完成")

运行结果:

执行完,test_dir_move 目录被递归删除。

磁盘/路径信息

shutil 除了可以复制、删除、移动文件和目录,还可以获取磁盘和路径信息,主要方法如下:

  • shutil.disk_usage(path) 获取磁盘总空间、已用空间、剩余空间(字节)

  • shutil.which(cmd) 查找系统命令的可执行文件路径(类似 Linux which)

示例:

import shutil

# 查看当前磁盘使用情况(Windows 填 C: ,Linux/Mac 填 / )
total, used, free = shutil.disk_usage(".")
print(f"磁盘总空间:{total//1024//1024} MB")
print(f"已用空间:{used//1024//1024} MB")
print(f"剩余空间:{free//1024//1024} MB")

# 查找系统命令路径
print("Python 路径:", shutil.which("python"))
print("pip 路径:", shutil.which("pip"))

运行结果:

磁盘总空间:132957 MB
已用空间:102959 MB
剩余空间:29998 MB
Python 路径: D:\Program Files\Python313\python.EXE
pip 路径: D:\Program Files\Python313\Scripts\pip.EXE

压缩/解压缩(内置支持)

shutil 还提供了用于创建和读取压缩及归档文件的高级工具。这些工具依赖于 zipfile 和 tarfile 模块。主要方法如下:

  • shutil.make_archive()    创建压缩包(支持 zip/tar/gztar 等)

  • shutil.unpack_archive() 解压压缩包

示例:

import shutil
import os

# 准备工作
with open("test.txt", "w", encoding="utf-8") as f:
    f.write("shutil 模块测试内容")
os.mkdir("test_dir")  # 创建目标目录
shutil.move("test.txt", "test_dir") # 移动文件到目标目录
shutil.move("test_dir", "test_dir_move") # 移动目录到目标目录

# 压缩目录:格式=zip,根目录=test_dir,保存为 archive
shutil.make_archive(
    base_name="archive",  # 压缩包名称
    format="zip",         # 压缩格式:zip / tar / gztar
    root_dir="test_dir_move"   # 要压缩的目录
)
print("压缩完成:archive.zip")

# 解压压缩包到新目录
shutil.unpack_archive(
    filename="archive.zip",
    extract_dir="unzip_dir"  # 解压目标目录
)
print("解压完成")

运行结果:

文件权限/属性操作

shutil 模块不仅用于文件与目录的复制、移动、删除等基础操作,同时也可用于处理文件权限与文件属性,能够便捷地对文件或目录的权限设置、属主信息,从而满足文件管理、系统脚本编写、批量文件处理等场景下对权限控制的需求。

  • shutil.copymode(src, dst)    仅复制文件权限,不复制文件内容。

  • shutil.copystat(src, dst)    仅复制文件权限和时间戳,不复制文件内容。

示例:

import shutil

# 复制 test_copy2.txt 的权限给 test_copy3.txt
shutil.copymode("test_copy2.txt", "test_copy3.txt")

# 复制文件所有状态(权限+时间)
shutil.copystat("test_copy2.txt", "test_copy3.txt")
print("权限复制完成")

综合实战

结合前面学习过的所有方法,写一个自动备份指定目录的小工具,工具运行步骤如下:

(1)复制源目录到备份目录

(2)压缩备份目录

(3)清理临时文件

代码如下:

import shutil
import os
from datetime import datetime

def backup_directory(source_dir, backup_root):
    """
    备份目录:复制 → 压缩 → 清理
    :param source_dir: 源目录
    :param backup_root: 备份根目录
    """
    # 创建带时间戳的备份目录
    time_str = datetime.now().strftime("%Y%m%d_%H%M%S")
    backup_dir = os.path.join(backup_root, f"backup_{time_str}")
    zip_name = os.path.join(backup_root, f"backup_{time_str}")

    # 复制目录
    shutil.copytree(source_dir, backup_dir)
    print(f"目录已复制:{backup_dir}")

    # 压缩备份
    shutil.make_archive(zip_name, "zip", backup_dir)
    print(f"压缩完成:{zip_name}.zip")

    # 删除临时复制的目录
    shutil.rmtree(backup_dir)
    print("临时文件已清理")
    print("备份全部完成!")


if __name__ == "__main__":
    # 备份 test_dir 到 backups 目录
    # 准备工作
    with open("test.txt", "w", encoding="utf-8") as f:
        f.write("shutil 模块测试内容")
    os.mkdir("test_dir")  # 创建目标目录
    shutil.move("test.txt", "test_dir") # 移动文件到目标目录
    shutil.move("test_dir", "test_dir_move") # 移动目录到目标目录
    
    # 确保 backups 目录存在
    os.makedirs("backups", exist_ok=True)
    # 执行备份操作
    backup_directory("test_dir_move", "backups")

运行结果:

目录已复制:backups\backup_20260414_170217
压缩完成:backups\backup_20260414_170217.zip
临时文件已清理
备份全部完成!

更多 shutil 模块更多信息请参考 https://docs.python.org/3/library/shutil.html 手册。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号