Python轮子:shutil~高级文件操作模块

原文链接: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 具有跨平台文件操作一致性,完整的目录树处理能力,灵活的文件过滤机制等优点。该模块是系统管理脚本的核心工具,通过合理组合不同方法,可以构建出强大的文件管理解决方案。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注