原文链接:http://www.juzicode.com/python-module-shutil/
Python的shutil模块是标准库中用于高级文件操作的核心工具,提供对文件和目录的跨平台管理。它封装了复杂底层操作,支持递归复制目录树(copytree)、删除非空目录(rmtree)、文件移动(move)、压缩打包(make_archive)等功能,相比os模块更侧重批量处理与元数据保留。它的设计简化了文件备份、部署脚本编写及临时数据清理场景,通过单行代码即可实现跨磁盘操作,同时兼容Windows/Linux/macOS系统,是自动化文件系统任务的首选工具。
应用场景
- 数据备份:批量复制重要文件到备份目录
- 部署工具:打包发布项目文件
- 临时清理:删除缓存或临时目录
- 文件迁移:跨磁盘移动大量数据
安装或导入
Python 内置标准库,直接导入使用:
import shutil
以下示例展示 shutil 的常用文件操作,包括复制、删除、移动等操作。
1. 复制文件
使用 copy() 复制单个文件:
#juzicode.com/VX公众号:juzicode
import shutil
shutil.copy('src.txt', 'backup/') # 复制到目录
shutil.copy('src.txt', 'dst.txt') # 复制并重命名
第1个复制如果backup文件夹存在,则会将src.txt拷贝到backup目录下,如果backup文件夹不存在则会抛异常。
第2个复制则是将src.txt拷贝并重命名为dst.txt
2. 复制目录
通过 copytree() 递归复制整个目录树。目标目录必须不存在。
#juzicode.com/VX公众号:juzicode
import shutil
shutil.copytree('src_dir/', 'backup/')
运行结果:
生成与 src_dir 结构相同的 backup 目录
需要注意如果backup目录已经存在,会导致抛FileExistsError异常!
3. 删除目录
使用 rmtree() 递归删除目录及内容,相比 os.remove() 可删除非空目录。
#juzicode.com/VX公众号:juzicode
import shutil
shutil.rmtree('temp/')
运行结果:
删除 temp 目录及其所有子文件
4. 移动文件/目录
通过 move() 实现跨磁盘移动。自动处理目录创建和覆盖逻辑。
#juzicode.com/VX公众号:juzicode
import shutil
shutil.move('old_dir/', 'new_location/')
运行结果:
桔子菌在win10 python3.10测试,如果move()执行前已经存在文件夹new_location,old_dir则会被移动到 new_location/old_dir,如果不存在则会将old_dir重命名为new_location。
5. 磁盘空间检查
通过 disk_usage() 查看磁盘使用情况。返回总容量、已用空间和剩余空间。
#juzicode.com/VX公众号:juzicode
import shutil
usage = shutil.disk_usage('/')
print(f"Total: {usage.total // (1024**3)}GB")
运行结果:
Total: 512GB
6. 保留元数据复制
使用 copy2() 保留元数据,比 copy() 多保留修改时间和权限信息。
#juzicode.com/VX公众号:juzicode
import shutil
shutil.copy2('src.txt', 'backup/') # 保留元数据
运行结果:
复制的文件保留原始时间戳和权限
7. 过滤文件类型
通过 ignore 参数排除特定文件,copytree() 支持自定义过滤函数。
#juzicode.com/VX公众号:juzicode
import shutil
def ignore_logs(dir, names):
return [name for name in names if name.endswith('.log')]
shutil.copytree('src/', 'backup/', ignore=ignore_logs)
运行结果:
备份目录中排除所有 .log 文件
8. 保留文件权限
使用 copystat() 同步目录权限,复制文件后保留原始属性。
import shutil
#juzicode.com/VX公众号:juzicode
shutil.copytree('src/', 'backup/')
shutil.copystat('src/', 'backup/')
运行结果:
备份目录与源目录权限相同
总结
shutil 具有跨平台文件操作一致性,完整的目录树处理能力,灵活的文件过滤机制等优点。该模块是系统管理脚本的核心工具,通过合理组合不同方法,可以构建出强大的文件管理解决方案。