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

Python shutil模块文件操作完全指南 | 高效文件管理技巧

Python shutil模块文件操作完全指南

在Python编程中,文件操作是常见任务之一。shutil模块提供了高效的文件和目录管理功能,可以简化复制、移动、删除等操作。本教程将详细介绍shutil模块的核心功能和使用方法。

shutil模块简介

shutil(shell utility)是Python标准库中用于高级文件操作的模块,提供了比os模块更便捷的文件和目录管理功能。

主要功能包括:

  • 文件和目录的复制
  • 文件和目录的移动(重命名)
  • 递归删除目录
  • 文件权限和元数据的处理
  • 磁盘空间使用情况查询

使用前需要导入模块:

import shutil

复制文件

shutil提供了多种文件复制方法,适用于不同场景。

1. shutil.copy() - 复制文件内容

复制源文件内容到目标文件,如果目标是目录则创建同名文件。

import shutil

# 复制文件内容(目标可以是文件或目录)
shutil.copy('source.txt', 'destination.txt')
shutil.copy('source.txt', 'backup/')  # 复制到backup目录

2. shutil.copy2() - 复制文件内容及元数据

类似于copy(),但会保留文件的元数据(如修改时间、权限等)。

# 复制文件并保留元数据
shutil.copy2('source.txt', 'destination.txt')

3. shutil.copyfile() - 仅复制内容

仅复制文件内容,目标必须是文件路径。

# 仅复制文件内容
shutil.copyfile('source.txt', 'destination.txt')

复制目录

shutil.copytree()方法可以递归复制整个目录树。

# 递归复制目录
shutil.copytree('source_dir', 'backup_dir')

# 复制时忽略特定文件/目录
def ignore_func(dir, names):
    return [name for name in names if name.endswith('.tmp')]

shutil.copytree('source', 'backup', ignore=ignore_func)

# 使用预定义忽略模式
shutil.copytree('source', 'backup', ignore=shutil.ignore_patterns('*.tmp', 'temp*'))

注意: 目标目录不能已存在,否则会引发FileExistsError。

移动文件/目录

shutil.move()方法用于移动文件或目录,也可用于重命名操作。

# 移动文件
shutil.move('source.txt', 'destination.txt')

# 移动目录
shutil.move('old_dir', 'new_location/')

# 重命名文件
shutil.move('old_name.txt', 'new_name.txt')

# 重命名目录
shutil.move('old_dir', 'new_dir')

提示: 如果目标位于同一文件系统,move()操作是原子操作(重命名)。跨文件系统移动时,实际是复制后删除源文件。

删除目录

shutil.rmtree()用于递归删除目录及其所有内容。

# 递归删除目录
shutil.rmtree('directory_to_remove')

# 删除时忽略错误(文件不存在等)
shutil.rmtree('dir', ignore_errors=True)

# 自定义错误处理
def on_error(func, path, exc_info):
    import os
    print(f"无法删除 {path} 因为: {exc_info[1]}")
    os.chmod(path, 0o777)  # 修改权限后重试

shutil.rmtree('dir', onerror=on_error)

警告: rmtree()会永久删除目录及其所有内容,请谨慎使用!

高级文件操作

磁盘空间使用

# 获取磁盘使用情况
total, used, free = shutil.disk_usage('/')
print(f"总空间: {total // (2**30)}GB")
print(f"已使用: {used // (2**30)}GB")
print(f"可用空间: {free // (2**30)}GB")

归档操作

# 创建ZIP归档
shutil.make_archive('backup', 'zip', 'source_dir')

# 解压归档
shutil.unpack_archive('backup.zip', 'extracted_files')

错误处理

文件操作中常见的异常需要妥善处理。

import shutil
import os

try:
    shutil.copy('source.txt', 'destination.txt')
except FileNotFoundError:
    print("错误:源文件不存在")
except PermissionError:
    print("错误:没有操作权限")
except shutil.SameFileError:
    print("错误:源和目标相同")
except Exception as e:
    print(f"未知错误: {str(e)}")

常见异常:

  • FileNotFoundError - 源文件/目录不存在
  • PermissionError - 权限不足
  • FileExistsError - 目标已存在
  • shutil.SameFileError - 源和目标相同

总结

shutil模块核心功能回顾

  • 使用copy()/copy2()复制文件
  • 使用copytree()复制整个目录
  • 使用move()移动或重命名文件和目录
  • 使用rmtree()递归删除目录
  • 使用disk_usage()获取磁盘空间信息
  • 使用make_archive()unpack_archive()处理压缩文件

最佳实践建议

  • 操作前检查文件和目录是否存在
  • 处理异常并提供有意义的错误信息
  • 递归操作时注意权限问题
  • 使用绝对路径避免路径错误
  • 重要操作前建议先备份数据

本教程更新于2023年10月 | Python shutil模块文件操作指南

发表评论