pin_drop当前位置:知识文库 ❯ 图文

Python shutil模块详解 - 文件操作高级指南

概述

Python 的 shutil 模块(shell utility 的缩写)是标准库中用于高级文件操作的工具模块。它提供了文件复制、移动、删除、权限管理、归档压缩等功能,是对 os 模块中基础文件操作的补充。shutil 的操作比 os 模块更高级,能够处理目录树、保留文件元数据等复杂场景,是日常文件管理自动化的核心工具。


语法

代码示例

import shutil

# 文件复制
shutil.copy(src, dst)
shutil.copy2(src, dst)
shutil.copyfile(src, dst)

# 目录操作
shutil.copytree(src, dst)
shutil.rmtree(path)
shutil.move(src, dst)

# 归档操作
shutil.make_archive(base_name, format, root_dir)
shutil.unpack_archive(filename, extract_dir)

# 磁盘信息
shutil.disk_usage(path)

参数说明

功能分类 主要函数 说明
文件复制 copy() 复制文件内容和权限
文件复制 copy2() 复制文件内容、权限和元数据
文件复制 copyfile() 仅复制文件内容
目录复制 copytree() 递归复制整个目录树
目录删除 rmtree() 递归删除整个目录树
文件移动 move() 移动文件或目录
归档压缩 make_archive() 创建归档文件
解压缩 unpack_archive() 解压归档文件
磁盘信息 disk_usage() 获取磁盘使用情况
权限管理 chmod() 修改文件权限
所属管理 chown() 修改文件所有者

返回值

不同函数返回值不同:copy()copy2() 返回目标路径字符串,make_archive() 返回归档文件路径,disk_usage() 返回命名元组。


代码示例

示例1:基本文件操作

代码示例

import shutil
import os

# 创建测试文件
with open('source.txt', 'w', encoding='utf-8') as f:
    f.write('Hello, shutil!')

# 复制文件
dst = shutil.copy('source.txt', 'dest.txt')
print(f"复制到: {dst}")

# 读取验证
with open('dest.txt', 'r', encoding='utf-8') as f:
    print(f"内容: {f.read()}")

# 清理
os.remove('source.txt')
os.remove('dest.txt')
print("清理完成")

输出:

代码示例

复制到: dest.txt
内容: Hello, shutil!
清理完成

示例2:磁盘信息查询

代码示例

import shutil

# 获取当前磁盘使用情况
usage = shutil.disk_usage('.')
print(f"磁盘使用情况:")
print(f"  总空间: {usage.total / (1024**3):.1f} GB")
print(f"  已使用: {usage.used / (1024**3):.1f} GB")
print(f"  可用空间: {usage.free / (1024**3):.1f} GB")
print(f"  使用率: {usage.used / usage.total * 100:.1f}%")

输出:

代码示例

磁盘使用情况:
  总空间: 500.0 GB
  已使用: 320.5 GB
  可用空间: 179.5 GB
  使用率: 64.1%

示例3:模块功能总览

代码示例

import shutil

print("shutil 模块主要功能:")
functions = {
    '文件复制': ['copy', 'copy2', 'copyfile', 'copyfileobj', 'copymode', 'copystat'],
    '目录操作': ['copytree', 'rmtree'],
    '文件移动': ['move'],
    '归档操作': ['make_archive', 'unpack_archive', 'get_archive_formats'],
    '系统信息': ['disk_usage'],
    '权限管理': ['chmod', 'chown', 'which'],
}

for category, funcs in functions.items():
    print(f"\n{category}:")
    for func in funcs:
        available = hasattr(shutil, func)
        status = "可用" if available else "不可用"
        print(f"  shutil.{func}: {status}")

输出:

代码示例

shutil 模块主要功能:

文件复制:
  shutil.copy: 可用
  shutil.copy2: 可用
  shutil.copyfile: 可用
  shutil.copyfileobj: 可用
  shutil.copymode: 可用
  shutil.copystat: 可用

目录操作:
  shutil.copytree: 可用
  shutil.rmtree: 可用

文件移动:
  shutil.move: 可用

归档操作:
  shutil.make_archive: 可用
  shutil.unpack_archive: 可用
  shutil.get_archive_formats: 可用

系统信息:
  shutil.disk_usage: 可用

权限管理:
  shutil.chmod: 可用
  shutil.chown: 可用
  shutil.which: 可用

实际应用场景

  • 文件备份:使用 shutil.copy2() 备份重要文件,保留完整的元数据信息。

  • 部署脚本:使用 shutil.copytree() 将构建产物复制到部署目录,使用 make_archive() 打包发布。

  • 日志管理:使用 shutil.move() 将旧日志移动到归档目录,使用 disk_usage() 监控磁盘空间。


注意事项

注意1:shutil 的操作是不可逆的(如 rmtree() 会永久删除目录),使用前应确认操作目标正确,建议先在测试环境验证。

注意2:shutil 的文件操作函数在目标已存在时默认会覆盖,不会提示确认。如需避免覆盖,应先检查目标是否存在。

注意3:shutil 的部分函数(如 chown)在 Windows 上功能有限或不可用,跨平台代码应考虑兼容性。

提示:对于大文件复制,shutil.copyfileobj() 可以指定缓冲区大小,比 copyfile() 更节省内存。


相关方法对比

对比项 shutil os模块 pathlib subprocess
文件复制 高级 不支持 不支持 cp命令
目录操作 递归支持 单层 有限 rm -rf
元数据保留 支持 手动 不支持 依赖命令
跨平台
适用场景 文件管理 基础操作 路径操作 系统命令

小贴士

shutil 模块是 Python 标准库的一部分,无需额外安装。如果你想查看完整的函数列表,可以在 Python 交互式环境中运行 dir(shutil)。另外,shutil 的官方文档可以参考:Python 官方 shutil 文档


小结

  • shutil 是 Python 标准库中高级文件操作的核心模块

  • 功能完整:提供文件复制、移动、删除、归档压缩等完整功能

  • 递归支持:支持目录树的递归操作和文件元数据的保留

  • 操作不可逆:使用前应确认目标正确


练习题

练习1

使用 shutil.disk_usage() 编写一个磁盘空间监控函数,当可用空间低于阈值时发出警告。

练习2

使用 shutil.which() 查找系统中可用的 Python 解释器路径,并输出结果。

练习3

对比 shutil.copy() 和 os.system('cp') 两种文件复制方式,讨论各自的优缺点。

常见问题

shutil模块需要额外安装吗?

不需要。shutil是Python标准库的一部分,安装Python后即可直接import使用,无需通过pip安装。

shutil和os模块有什么区别?

os模块提供基础的文件系统操作(如创建目录、删除文件),而shutil提供更高级的操作(如递归复制目录、保留元数据的文件复制、归档压缩等)。两者互补使用。

shutil.copy()和shutil.copy2()有什么区别?

copy()复制文件内容和权限,但不保留元数据(修改时间等);copy2()额外保留文件的元数据信息。备份场景推荐使用copy2()。

shutil在Windows上有什么限制?

部分函数如chown(修改文件所有者)在Windows上功能有限。符号链接相关操作也可能受Windows权限限制。跨平台开发时需要注意兼容性测试。

如何用shutil压缩文件夹?

使用shutil.make_archive()函数,支持zip和tar格式。例如:shutil.make_archive('output', 'zip', root_dir) 会将root_dir目录压缩为output.zip。

标签: shutil 文件操作 Python标准库 文件复制 目录操作 磁盘信息 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: argparse参数默认值详解 - SUPPRESS与set_defaults实战 下一篇: Python shutil.copy()详解 - 文件复制函数使用指南

poll相关推荐