Python shutil库使用指南
概述
shutil模块提供了许多高级的文件操作功能,特别是支持文件和目录的复制、移动和删除操作。它是Python标准库的一部分,通常与os模块配合使用。
文件和目录操作
复制文件
shutil.copyfile(src, dst)
:复制文件内容(不包含元数据)shutil.copy(src, dst)
:复制文件内容和权限模式shutil.copy2(src, dst)
:复制文件内容、权限模式和所有元数据
使用经验:
- 在需要保留文件元数据(如创建时间)时,优先使用copy2
- 对于大文件复制,可以结合进度条显示:
from tqdm import tqdm
def copy_with_progress(src, dst):
with open(src, 'rb') as fsrc:
with open(dst, 'wb') as fdst:
with tqdm(total=os.path.getsize(src), unit='B', unit_scale=True) as pbar:
while True:
buf = fsrc.read(16*1024)
if not buf:
break
fdst.write(buf)
pbar.update(len(buf))
复制目录
shutil.copytree(src, dst)
:递归复制整个目录树
常见问题:
- 目标目录已存在时会报错,可以设置
dirs_exist_ok=True
- 忽略特定文件模式:
copytree('src', 'dst',
ignore=ignore_patterns('*.tmp', '.git*'))
删除目录
shutil.rmtree(path)
:递归删除目录树
注意事项:
- 删除操作不可逆,建议先备份重要数据
- 在Windows上删除只读文件时可能会失败,可以添加错误处理:
def remove_readonly(func, path, _):
os.chmod(path, stat.S_IWRITE)
func(path)
shutil.rmtree(path, onexc=remove_readonly)
移动文件/目录
shutil.move(src, dst)
:移动文件或目录到新位置
使用技巧:
- 跨分区移动时,实际上是复制+删除操作
- 对于大量小文件,建议先打包再移动
归档操作
shutil提供了创建和读取压缩归档文件的功能:
创建归档
shutil.make_archive(base_name, format, root_dir)
:创建归档文件- 支持的格式:zip, tar, gztar, bztar, xztar
性能优化:
- 对于大量小文件,先创建tar包再压缩比直接创建gztar更快
- 多线程压缩大文件:
from concurrent.futures import ThreadPoolExecutor
def compress_file(file):
shutil.make_archive(file, 'gztar', root_dir=file)
with ThreadPoolExecutor() as executor:
executor.map(compress_file, large_files)
解压归档
shutil.unpack_archive(filename, extract_dir)
:解压归档文件
安全建议:
- 解压前检查压缩包内容,防止路径穿越攻击
- 设置解压过滤器:
shutil.unpack_archive('archive.zip', 'extract_dir', filter='data')
实用工具
磁盘使用情况
shutil.disk_usage(path)
:获取指定路径的磁盘使用统计
使用场景:
- 在备份前检查目标磁盘空间
- 监控磁盘使用情况,及时清理
查找可执行文件
shutil.which(cmd)
:查找可执行文件的路径
实用技巧:
- 检查程序依赖是否安装
- 查找系统命令的完整路径
终端大小
shutil.get_terminal_size()
:获取终端窗口的大小
应用场景:
- 调整输出格式适应终端宽度
- 创建自适应命令行界面
个人使用心得
- 备份策略:
- 使用copytree进行增量备份
- 配合make_archive创建压缩备份
- 定期清理旧备份
- 部署应用:
- 使用shutil部署Python包
- 复制配置文件模板
- 清理临时文件
- 性能优化:
- 大文件复制使用分块读写
- 多线程处理多个文件
- 使用快速复制系统调用(Python 3.8+)
- 错误处理:
- 添加详细的日志记录
- 实现重试机制
- 提供友好的错误提示