shutil 全称 shell utility(shell 工具),是 Python 内置的文件 / 目录高级操作模块,专门用于处理文件复制、文件移动、文件删除、文件压缩、文件权限修改等操作,弥补了内置 os 模块在文件操作上的不足。
使用如下方法实现文件目录的复制:
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.EXEshutil 还提供了用于创建和读取压缩及归档文件的高级工具。这些工具依赖于 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 手册。