为什么选择shutil模块?
shutil是Python标准库中用于高级文件操作的模块,提供了比os模块更简单的文件复制、移动、删除和归档操作接口。
shutil模块核心方法
复制文件 - copy()
复制单个文件到目标位置,保留文件权限但不保留元数据。
shutil.copy(src, dst, *, follow_symlinks=True)
import shutil
# 复制文件到目标目录
shutil.copy('source.txt', 'backup/')
# 复制文件并重命名
shutil.copy('report.docx', 'backup/report_backup.docx')
复制文件及元数据 - copy2()
类似于copy(),但会保留文件的所有元数据(包括创建时间、修改时间等)。
shutil.copy2(src, dst, *, follow_symlinks=True)
import shutil
# 复制文件并保留元数据
shutil.copy2('original.jpg', 'backup/original_backup.jpg')
复制目录 - copytree()
递归复制整个目录树,包括所有子目录和文件。
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)
import shutil
# 复制整个目录
shutil.copytree('project/', 'project_backup/')
# 复制时忽略特定文件
def ignore_pycache(dir, names):
return [name for name in names if name == '__pycache__']
shutil.copytree('src/', 'src_backup/', ignore=ignore_pycache)
移动文件/目录 - move()
将文件或目录移动到新位置,也可用于重命名操作。
shutil.move(src, dst, copy_function=copy2)
import shutil
# 移动文件到新位置
shutil.move('old_location/data.csv', 'new_location/')
# 重命名文件
shutil.move('old_name.txt', 'new_name.txt')
删除目录树 - rmtree()
递归删除整个目录树(包括子目录和文件),类似于rm -rf命令。
shutil.rmtree(path, ignore_errors=False, onerror=None)
import shutil
# 删除整个目录
shutil.rmtree('temp_files/')
# 安全删除,忽略错误
shutil.rmtree('cache/', ignore_errors=True)
注意: 使用rmtree()要格外小心,因为它会永久删除目录及其所有内容。
磁盘空间查询 - disk_usage()
查询磁盘使用情况,返回总空间、已用空间和可用空间(字节)。
shutil.disk_usage(path)
import shutil
# 获取当前目录磁盘使用情况
usage = shutil.disk_usage('.')
print(f"总空间: {usage.total / (1024**3):.2f} GB")
print(f"已用空间: {usage.used / (1024**3):.2f} GB")
print(f"可用空间: {usage.free / (1024**3):.2f} GB")
高级文件操作
shutil与os模块对比
操作类型 | shutil方法 | os模块方法 | 优势 |
---|---|---|---|
复制文件 | copy()/copy2() | 需要open+read+write组合 | 代码更简洁,支持元数据 |
复制目录 | copytree() | 需要递归实现 | 一行代码完成复杂操作 |
删除目录树 | rmtree() | 需要递归删除 | 安全高效,错误处理完善 |
移动文件 | move() | os.rename() | 跨文件系统支持 |
实际应用场景
📁 项目备份工具
使用copytree()创建项目完整备份,排除临时文件和缓存目录:
import shutil
from datetime import datetime
def backup_project(project_path, backup_dir):
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"{backup_dir}/project_{timestamp}"
ignore = shutil.ignore_patterns('*.tmp', '__pycache__', '.cache')
shutil.copytree(project_path, backup_path, ignore=ignore)
print(f"项目已备份到: {backup_path}")
🗑️ 清理临时文件
使用rmtree()安全清理临时目录:
import shutil
import os
def clean_temp_dirs(temp_dirs):
for dir_path in temp_dirs:
if os.path.exists(dir_path):
try:
shutil.rmtree(dir_path)
print(f"已清理: {dir_path}")
except Exception as e:
print(f"清理失败 {dir_path}: {e}")
💾 磁盘空间监控
使用disk_usage()监控磁盘空间并发出警报:
import shutil
def check_disk_space(path, threshold_gb=5):
usage = shutil.disk_usage(path)
free_gb = usage.free / (1024 ** 3)
if free_gb < threshold_gb:
print(f"警告: {path} 仅剩 {free_gb:.1f} GB 空间!")
# 发送警报邮件或通知
return False
return True
总结
shutil模块是Python中处理文件和目录的强大工具,它提供的高级操作可以大大简化文件管理任务:
- 使用copy/copy2进行文件复制操作
- 使用copytree复制整个目录结构
- 使用move进行文件/目录移动和重命名
- 使用rmtree安全删除目录树
- 使用disk_usage监控磁盘空间
掌握shutil模块能显著提高文件操作代码的效率与可读性,是每个Python开发者必备的工具集。
发表评论