本文最后更新于20 天前,其中的信息可能已经过时,如有错误请发送邮件到linmwo@qq.com
在日常的 Python 开发中,我们经常需要对文件和文件夹进行复制、移动、压缩等操作。虽然 os
模块也能完成部分功能,但它更偏向底层,操作相对繁琐。而 shutil
(shell utility)模块则提供了更高级、更方便的文件操作方法。
本文将总结 shutil
的常用功能,并通过示例帮助你快速掌握它。
1. 基本文件操作
1.1 复制文件
- 复制文件:
shutil.copy(src, dst)
- 复制文件并保留权限:
shutil.copy2(src, dst)
import shutil
shutil.copy("test.txt", "backup.txt") # 复制文件内容
shutil.copy2("test.txt", "backup2.txt") # 复制文件+元数据(修改时间、权限等)
注意:
dst
可以是目录,此时会自动使用src
文件名作为目标文件名。
1.2 复制整个目录
- 复制目录:
shutil.copytree(src, dst, dirs_exist_ok=False)
shutil.copytree("my_folder", "my_folder_backup")
- 如果目标目录存在,Python 3.8+ 可以用
dirs_exist_ok=True
:
shutil.copytree("my_folder", "my_folder_backup", dirs_exist_ok=True)
1.3 移动或重命名文件/目录
- 移动(或重命名):
shutil.move(src, dst)
shutil.move("test.txt", "archive/test.txt")
如果 dst
是目录,则移动到该目录;如果是文件名,则相当于重命名。
1.4 删除目录
- 递归删除:
shutil.rmtree(path)
shutil.rmtree("temp_folder")
⚠ 注意:
rmtree
会直接删除整个目录树,不可恢复,使用前务必确认!
2. 高级文件操作
2.1 文件描述符复制
shutil.copyfileobj(fsrc, fdst, length=16*1024)
适用于打开的文件对象之间的复制:
with open("source.txt", "rb") as fsrc, open("target.txt", "wb") as fdst:
shutil.copyfileobj(fsrc, fdst)
可以指定
length
来控制缓冲区大小,提高大文件复制效率。
2.2 获取磁盘空间
total, used, free = shutil.disk_usage("/")
print(f"总空间: {total // (1024**3)} GB")
print(f"已用空间: {used // (1024**3)} GB")
print(f"可用空间: {free // (1024**3)} GB")
2.3 查找可执行文件
path = shutil.which("python")
print(path) # 例如:C:\Python39\python.exe
3. 压缩与解压
shutil
提供了快速的压缩/解压工具(底层基于 zipfile
、tarfile
)。
3.1 压缩目录
shutil.make_archive("backup", "zip", "my_folder")
# 生成 backup.zip,包含 my_folder 的所有内容
参数:
- 第1个参数:生成文件名(不带扩展名)
- 第2个参数:压缩格式(zip、tar、gztar、bztar、xztar)
- 第3个参数:要打包的目录
3.2 解压文件
shutil.unpack_archive("backup.zip", "restore_folder")
自动识别压缩格式并解压到
restore_folder
。
4. 实用技巧
4.1 仅复制目录结构(不复制文件)
有时只想复制目录树,可以这样做:
import os
def copy_structure(src, dst):
for root, dirs, files in os.walk(src):
for d in dirs:
new_dir = os.path.join(dst, os.path.relpath(os.path.join(root, d), src))
os.makedirs(new_dir, exist_ok=True)
copy_structure("my_folder", "empty_structure")
4.2 目录同步(覆盖更新)
shutil.copytree("src_folder", "dst_folder", dirs_exist_ok=True)
适用于做增量更新。
4.3 临时文件管理
搭配 tempfile
模块,可用来做临时拷贝或备份:
import tempfile
with tempfile.TemporaryDirectory() as tmpdir:
shutil.copy("test.txt", tmpdir)
print("已拷贝到临时目录:", tmpdir)
# 退出 with 后,临时目录会被自动删除
5. 总结
shutil
是对 os
的高层封装,能大幅简化文件管理操作:
- 文件/目录:复制、移动、删除
- 压缩/解压:快速打包和解压
- 实用工具:磁盘使用情况、查找可执行文件
在备份、自动化脚本、运维工具等场景中非常实用。
推荐练习:
- 实现一个文件夹备份工具:支持 zip 打包 + 时间戳命名。
- 写个磁盘监控脚本:当磁盘剩余空间低于阈值时报警。
- 目录同步器:基于
copytree(dirs_exist_ok=True)
做增量更新。
Views: 0