复制文件。copy只复制文件内容和权限,copy2在此基础上额外保留文件的元数据(访问/修改时间等)。
import shutil
# 只复制内容和权限
shutil.copy('data/source.txt', 'backup/source_copy.txt')
# 复制内容、权限并保留元数据
shutil.copy2('data/source.txt', 'backup/source_copy2.txt')
copyfile进行二进制层面的文件复制,要求源文件必须是普通文件;copyfileobj接受已打开的文件对象,可用于部分复制或自定义缓冲区大小。
import shutil
# 直接复制文件(二进制拷贝)
shutil.copyfile('data/a.bin', 'data/b.bin')
# 使用文件对象拷贝(可指定 length)
with open('data/a.bin', 'rb') as fsrc, open('data/b.bin', 'wb') as fdst:
shutil.copyfileobj(fsrc, fdst, length=1024*64) # 每次拷贝 64KB
仅复制文件的权限信息(copymode)或完整的状态信息(权限、时间戳等,copystat)。
import shutil, os
src = 'data/original.txt'
dst = 'data/clone.txt'
shutil.copy(src, dst) # 先复制内容
shutil.copymode(src, dst) # 只复制权限
shutil.copystat(src, dst) # 复制权限+时间戳等
递归复制整个目录树。dirs_exist_ok=True(Python 3.8+)允许目标目录已存在;ignore 可用于过滤不需要复制的文件。
import shutil, os
def ignore_pycache(dir, files):
return [f for f in files if f == '__pycache__']
shutil.copytree('project_src', 'project_backup',
ignore=ignore_pycache) # 忽略 __pycache__ 目录
移动文件或目录,等价于系统的 mv。如果 dst 为已存在的目录,源会被移动进去;如果是文件路径,则会改名。
import shutil
# 移动文件并改名
shutil.move('temp/report.txt', 'archive/2025/report_2025.txt')
# 移动整个目录
shutil.move('old_project', 'archived_projects/old_project')
递归删除目录及其所有内容。onerror 可用于处理只读文件等异常。
import shutil, os, stat
def on_rm_error(func, path, exc_info):
# 清除只读属性后重试删除
os.chmod(path, stat.S_IWRITE)
func(path)
shutil.rmtree('temp_folder', onerror=on_rm_error)
创建压缩归档。format 支持 'zip'、'tar'、'gztar' 等。对应的解压函数是 shutil.unpack_archive。
import shutil
# 打包为 zip
shutil.make_archive('backup/project', 'zip', root_dir='project')
# 解压 zip 包
shutil.unpack_archive('backup/project.zip', extract_dir='project_restored')
返回指定路径所在磁盘的总容量、已用空间和可用空间(字节)。
import shutil
total, used, free = shutil.disk_usage('/')
print(f"总容量: {total//(2**30)} GB")
print(f"已用: {used//(2**30)} GB")
print(f"可用: {free//(2**30)} GB")
获取当前支持的压缩格式列表,可配合 make_archive 使用。
import shutil
print("支持的压缩格式:", shutil.get_archive_formats())
# 示例输出: [('zip', 'ZIP archive', shutil._make_zip_archive), ...]
在类 Unix 系统上修改文件或目录的所有者和所属组。Windows 不支持。
import shutil
# 将文件所有者改为 'alice',组改为 'staff'
shutil.chown('data/report.txt', user='alice', group='staff')
帮助快速掌握 shutil 模块的核心功能与常见用法。