当前位置: 首页 > news >正文

Python shutil模块详解

文章目录

  • Python shutil模块详解
    • 一、模块基础
      • 1. 模块导入
      • 2. 模块特点
    • 二、文件操作
      • 1. 文件操作方法对比
      • 2. 代码示例
    • 三、目录操作
      • 1. 目录操作方法对比
      • 2. 代码示例
    • 四、归档操作
      • 1. 归档格式支持
      • 2. 归档操作代码
    • 五、磁盘空间管理
      • 1. 磁盘空间方法
      • 2. 代码示例
    • 六、高级功能
      • 1. 自定义复制行为
      • 2. 处理特殊文件
    • 七、异常处理
      • 1. 常见异常类型
      • 2. 异常处理示例
    • 八、最佳实践
    • 九、与os模块对比
    • 十、总结

Python shutil模块详解

shutil(shell utility的缩写)是Python标准库中用于高级文件操作的核心模块,提供了比os模块更便捷的文件和目录管理功能。下面我将全面讲解shutil模块的各类功能。

一、模块基础

1. 模块导入

import shutil

2. 模块特点

  • 提供高级文件操作接口
  • 支持递归目录操作
  • 包含归档/压缩功能
  • 跨平台兼容

二、文件操作

1. 文件操作方法对比

方法描述是否保留元数据示例
shutil.copy()复制文件内容不保留shutil.copy("src.txt", "dst.txt")
shutil.copy2()复制文件内容和元数据保留shutil.copy2("src.txt", "dst.txt")
shutil.copyfile()仅复制内容(更低级)不保留shutil.copyfile("src.txt", "dst.txt")
shutil.copyfileobj()复制文件对象-shutil.copyfileobj(src_fp, dst_fp)
shutil.move()移动/重命名文件保留shutil.move("old.txt", "new.txt")

2. 代码示例

# 基本文件复制
shutil.copy("source.txt", "backup.txt")  # 只复制内容# 保留元数据的复制
shutil.copy2("config.ini", "config_backup.ini")  # 保留修改时间等# 文件移动/重命名
shutil.move("old_name.txt", "new_name.txt")# 低级文件对象复制
with open("src.bin", "rb") as src, open("dst.bin", "wb") as dst:shutil.copyfileobj(src, dst, length=16 * 1024)  # 16KB块复制

三、目录操作

1. 目录操作方法对比

方法描述是否递归示例
shutil.copytree()复制整个目录树shutil.copytree("src", "dst")
shutil.rmtree()删除整个目录树shutil.rmtree("dir")
shutil.move()移动/重命名目录-shutil.move("old_dir", "new_dir")

2. 代码示例

# 复制整个目录
shutil.copytree("source_dir", "backup_dir",ignore=shutil.ignore_patterns("*.tmp", "temp*"))# 删除目录及其内容
shutil.rmtree("obsolete_dir", ignore_errors=True)  # 忽略错误# 目录移动/重命名
shutil.move("old_project", "new_project")# 自定义忽略模式
def ignore_pycache(dirname, filenames):return [name for name in filenames if name == "__pycache__"]shutil.copytree("src", "dst", ignore=ignore_pycache)

四、归档操作

1. 归档格式支持

格式方法示例
ZIPmake_archive()/unpack_archive()shutil.make_archive("backup", "zip", "src")
TARmake_archive()/unpack_archive()shutil.make_archive("backup", "tar", "src")
GZTARmake_archive()shutil.make_archive("backup", "gztar", "src")
BZTARmake_archive()shutil.make_archive("backup", "bztar", "src")
XZTARmake_archive()shutil.make_archive("backup", "xztar", "src")

2. 归档操作代码

# 创建ZIP归档
shutil.make_archive("data_backup", "zip", "data")# 创建带时间戳的压缩包
import time
archive_name = f"backup_{time.strftime('%Y%m%d')}"
shutil.make_archive(archive_name, "gztar", "project")# 解压归档文件
shutil.unpack_archive("backup.zip", "restore_dir")# 获取支持的归档格式
print(shutil.get_archive_formats())  # [('gztar', "gzip'ed tar-file"), ...]

五、磁盘空间管理

1. 磁盘空间方法

方法描述示例
shutil.disk_usage()获取磁盘使用情况usage = shutil.disk_usage("/")
shutil.which()查找可执行程序路径python_path = shutil.which("python")

2. 代码示例

# 检查磁盘空间
usage = shutil.disk_usage("/")
print(f"总空间: {usage.total/1024/1024:.1f}MB")
print(f"已用空间: {usage.used/1024/1024:.1f}MB")
print(f"剩余空间: {usage.free/1024/1024:.1f}MB")# 查找可执行文件
python_path = shutil.which("python3")
print(f"Python路径: {python_path}")

六、高级功能

1. 自定义复制行为

# 自定义复制函数
def custom_copy(src, dst, *, follow_symlinks=True):print(f"正在复制 {src}{dst}")return shutil.copy2(src, dst, follow_symlinks=follow_symlinks)# 注册自定义复制函数
shutil.copy = custom_copy# 现在所有shutil.copy调用都会打印信息
shutil.copy("a.txt", "b.txt")

2. 处理特殊文件

# 处理特殊文件(如设备文件)
def special_file_handler(src, dst, *, follow_symlinks=True):if os.path.isdir(src):raise ValueError("不支持目录")with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:shutil.copyfileobj(fsrc, fdst)return dstshutil.register_unpack_format('special', ['.spl'], special_file_handler)

七、异常处理

1. 常见异常类型

异常描述触发场景
shutil.Error多文件操作错误copytree/rmtree中出现多个错误
shutil.SameFileError源和目标相同copy/copy2(src, src)
shutil.ExecError执行错误归档/解压失败
OSError系统级错误权限不足/磁盘满等

2. 异常处理示例

try:shutil.copytree("src", "dst")
except shutil.Error as e:print(f"复制错误: {e}")for src, dst, err_msg in e.args[0]:print(f"失败: {src} -> {dst}: {err_msg}")
except OSError as e:print(f"系统错误: {e}")

八、最佳实践

  1. 优先使用copy2:保留文件元数据
  2. 处理大文件使用copyfileobj:可控制缓冲区大小
  3. copytree前检查目标:避免意外覆盖
  4. 使用ignore参数过滤文件:提高效率
  5. 处理磁盘空间:大文件操作前检查
  6. 考虑错误恢复:捕获并处理异常
  7. 临时文件使用tempfile:更安全可靠

九、与os模块对比

功能os模块shutil模块
文件复制需手动读写copy()/copy2()
目录复制需递归实现copytree()
目录删除只能删空目录rmtree()可删非空目录
文件移动os.rename()有限制move()更强大
归档操作make_archive()

十、总结

shutil模块提供了:

  • 高级文件/目录操作接口
  • 递归目录处理能力
  • 多种归档格式支持
  • 磁盘空间管理工具
  • 丰富的异常处理机制

它是Python文件系统编程中不可或缺的工具,特别适合需要复杂文件操作的场景。合理使用shutil可以大幅简化代码并提高可靠性。

http://www.lryc.cn/news/585118.html

相关文章:

  • GPT3/chatGPT/T5/PaLM/LLaMA/GLM主流大语言模型的原理和差异
  • 从零实现一个GPT 【React + Express】--- 【3】解析markdown,处理模型记忆
  • 【LeetCode 热题 100】146. LRU 缓存——哈希表+双向链表
  • 0102基础补充_交易演示-区块链-web3
  • Django母婴商城项目实践(二)
  • 机器学习数据集划分全指南:train_test_split详解与实践
  • 基于相似性引导的多视角功能性脑网络融合|文献速递-最新论文分享
  • 【科研绘图系列】R语言绘制系统发育树和柱状图
  • 思维链革命:让大模型突破“机器思考”的边界
  • UniHttp中HttpApiProcessor生命周期钩子介绍以及公共参数填充-以百度天气接口为例
  • Grid网格布局完整功能介绍和示例演示
  • hive/spark sql中unix_timestamp 函数的坑以及时间戳相关的转换
  • php中调用对象的方法可以使用array($object, ‘methodName‘)?
  • 【JMeter】接口加密
  • 【JMeter】数据驱动测试
  • 预防DNS 解析器安全威胁
  • flutter redux状态管理
  • 【unitrix】 4.21 类型级二进制数基本结构体(types.rs)
  • JavaScript加强篇——第五章 DOM节点(加强)与BOM
  • 【驱动】移植CH340驱动,设置 udev 规则,解决和 BRLTTY 的冲突
  • 容器管理: 单机用Docker Compose,多机用Kubernetes
  • 用 React Three Fiber 实现 3D 城市模型的扩散光圈特效
  • 保安员从业资格证历年考试真题
  • Debian:从GNOME切换到Xfce
  • 【音视频】HLS拉流抓包分析
  • 物联网与互联网融合生态
  • C#事件:从原理到实践的深度剖析
  • 小架构step系列11:单元测试引入
  • 基于规则匹配的文档标题召回
  • 【天坑记录】cursor jsx文件保存时错误格式化了