百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python shutil模块完全指南:从基础到高级文件操作

itomcoil 2025-05-15 18:22 3 浏览

一、初识shutil:为什么需要它?

Python的os模块虽能处理基础文件操作,但在复杂场景下存在局限。shutil(Shell Utilities)提供更强大的文件管理功能,特别适合:

  • 批量处理:秒级复制整个目录结构
  • 数据备份:智能创建压缩存档
  • 项目部署:自动化文件分发
  • 跨平台:统一处理Windows/Linux路径
# 基础示例:复制文件并重命名
import shutil
shutil.copy('report.txt', 'backup/2023_report.txt')  # 自动创建目标目录

二、核心功能深度解析

1. 文件与目录复制

(1) 智能文件复制

def advanced_copy(src: str, dst: str) -> None:
    """
    高级文件复制(带元数据保留)
    
    参数:
        src: 源文件路径
        dst: 目标路径(支持目录或完整路径)
        
    特性:
         保留修改时间/权限
         自动创建目标目录
         支持跨设备复制
    """
    try:
        shutil.copy2(src, dst)  # 使用copy2保留元数据
        print(f" 复制成功:{src} → {dst}")
    except FileNotFoundError:
        print(f" 错误:源文件 {src} 不存在")
    except PermissionError:
        print(f" 权限不足:无法写入 {dst}")
    except shutil.SameFileError:  # 新增错误类型
        print(" 源文件和目标文件相同")

(2) 目录递归复制

def backup_project(src_dir: str, dest_dir: str) -> None:
    """
    项目备份(带过滤规则)
    
    过滤规则:
         忽略.tmp文件和__pycache__目录
         保留符号链接
         支持增量备份(dirs_exist_ok)
    """
    try:
        shutil.copytree(
            src_dir,
            f"{dest_dir}/backup",
            ignore=shutil.ignore_patterns('*.tmp', '__pycache__'),
            symlinks=True,
            dirs_exist_ok=True  # Python 3.8+支持
        )
        print(f" 项目备份完成:{dest_dir}")
    except shutil.Error as e:
        print(f" 备份错误:{e}")

2. 文件移动与删除

(1) 安全删除目录树

def delete_directory(path: str) -> None:
    """
    强制删除非空目录
    
    特性:
         自动处理只读文件(Windows)
         静默处理不存在的目录
    """
    def remove_readonly(func, path, _):
        "回调函数处理只读文件"
        os.chmod(path, stat.S_IWRITE)
        func(path)
        
    shutil.rmtree(
        path,
        ignore_errors=True,
        onerror=remove_readonly  # Windows专用处理
    )
    print(f" 目录已删除:{path}")

3. 压缩与解压

(1) 多格式压缩包创建

def create_archive(source_dir: str, output_path: str, format: str = "zip") -> None:
    """
    支持多种压缩格式
    
    参数:
        format: zip/tar/gztar/bztar/xztar
        
    示例:
        create_archive("docs", "backup/docs", "gztar")
        → 生成 docs.tar.gz
    """
    try:
        shutil.make_archive(
            base_name=output_path,
            format=format,
            root_dir=source_dir,
            base_dir='.'  # 压缩目录内容而非目录本身
        )
        print(f" 压缩包已创建:{output_path}.{format}")
    except shutil.ArchiveError as e:
        print(f" 压缩失败:{e}")

三、进阶工具与技巧

1. 磁盘空间监控

def check_disk_space(path: str) -> tuple[float, float, float]:
    """
    返回指定路径的磁盘空间(GB)
    
    返回值:
        (总空间, 已用空间, 剩余空间)
    """
    total, used, free = shutil.disk_usage(path)
    return (
        round(total/2**30, 1),
        round(used/2**30, 1),
        round(free/2**30, 1)
    )

2. 大文件分块复制

def copy_large_file(src: str, dst: str, buffer_size: int = 16*1024*1024) -> None:
    """
    高效复制大文件
    
    参数:
        buffer_size: 缓冲区大小(默认16MB)
    """
    try:
        with open(src, "rb") as fsrc, open(dst, "wb") as fdst:
            while chunk := fsrc.read(buffer_size):
                fdst.write(chunk)
                print(f"进度:{fdst.tell()/1024**2:.1f}MB", end="\r")
        print("\n 复制完成")
    except Exception as e:
        print(f"\n 复制失败:{e}")

四、综合案例:智能备份系统

import shutil
from pathlib import Path
from datetime import datetime

class BackupManager:
    """
    智能备份系统
    
    功能:
         自动清理旧备份
         支持排除特定文件
         生成操作日志
    """
    
    def __init__(self, project_dir: str, backup_root: str, keep_count: int = 5):
        self.project_dir = Path(project_dir)
        self.backup_root = Path(backup_root)
        self.keep_count = keep_count
        self.backup_root.mkdir(parents=True, exist_ok=True)
        
    def _generate_backup_name(self) -> str:
        """生成带时间戳的名称"""
        return f"backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
    
    def _clean_old_backups(self) -> None:
        """保留最近N个备份"""
        backups = sorted(
            self.backup_root.glob("backup_*.zip"),
            key=lambda f: f.stat().st_mtime,
            reverse=True
        )
        for old_backup in backups[self.keep_count:]:
            old_backup.unlink()
            print(f" 已删除旧备份:{old_backup.name}")
    
    def run(self) -> None:
        try:
            # 检查磁盘空间
            total, used, free = check_disk_space(self.backup_root)
            if free < 1.0:  # 保留至少1GB空间
                raise RuntimeError("磁盘空间不足")
                
            # 创建压缩包
            backup_name = self._generate_backup_name()
            shutil.make_archive(
                self.backup_root / backup_name,
                "zip",
                self.project_dir,
                ignore=shutil.ignore_patterns("*.log", "__pycache__")
            )
            
            # 清理旧备份
            self._clean_old_backups()
            print(" 备份成功完成!")
            
        except Exception as e:
            print(f" 备份失败:{e}")
            # 记录错误日志
            with open(self.backup_root / "errors.log", "a") as f:
                f.write(f"[{datetime.now()}] {str(e)}\n")

五、最佳实践指南

1. 路径处理规范

from pathlib import Path

# 跨平台路径拼接
project_dir = Path.home() / "projects" / "myapp"
backup_dir = Path("/mnt/backup") / "myapp"

# 路径验证
if not project_dir.exists():
    raise FileNotFoundError(f"目录不存在:{project_dir}")

2. 异常处理模板

def safe_operation():
    try:
        # 文件操作代码
        pass
    except (shutil.Error, OSError) as e:
        print(f" 操作失败:{e}")
        # 执行回滚操作
    except Exception as e:
        print(f" 未知错误:{e}")
        raise
    finally:
        # 释放资源
        pass

附录:功能对比表

功能

推荐函数

适用场景

特性

复制文件

copy2()

保留元数据

修改时间/权限

递归复制目录

copytree()

项目部署

支持过滤规则

删除目录树

rmtree()

清理临时文件

强制删除只读文件

创建压缩包

make_archive()

数据备份

支持ZIP/TAR等格式

磁盘监控

disk_usage()

空间预警

返回总/已用/剩余空间

相关推荐

Python 上下文管理器魔法手册:with 语句的终极艺术

对话实录小白:(抓狂)我写了f=open("data.txt"),结果忘记关闭文件了!专家:(掏出魔法书)用with语句,文件自动关闭,永不泄露!上下文管理器基础三连击1.基...

【验证码逆向专栏】某安登录流程详解与验证码逆向分析与识别

声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁...

Python常用内置模块介绍——文件与系统操作详解

Python提供了多个强大的内置模块用于文件和系统操作,下面我将详细介绍最常用的几个模块及其核心功能。1.os模块-操作系统交互os模块提供了与操作系统交互的接口,包括文件/目录操作、进程管理、环...

21-Python-文件操作

在Python中,文件操作是非常重要的一部分,它允许我们读取、写入和修改文件。下面将详细讲解Python文件操作的各个方面,并给出相应的示例。1-打开文件在Python中,使用`open()`函数来打...

Python 开发工程师必会的 5 个文件操作库

在Python开发的世界里,文件操作是一项基础且高频的任务。从日常的数据处理到复杂的项目部署,熟练掌握文件操作库能让我们的开发工作事半功倍。本文和大家聊聊我眼中开发必备的5个文件操作库,它们各...

你应该知道的 50 个 Python 单行代码

使用Python总是可以轻松完成一些特定任务,这让人惊奇。一些比较繁琐的任务可以使用Python在单行代码中完成。下面是我收集的50个Python单行代码实例。1.移位词:猜字母的个...

Python10个了不起的10个库,用于文件操作、接口测试

日常接口测试中需要大量的操作文件,譬如:用户登录信息、数据库信息等等。了解下方10个文件操作库,可以快速提升在工作中的效率。os:提供了与操作系统交互的功能,包括文件和目录操作、进程管理等。示例代码参...

手把手教你开发智能备份神器,小白也能30分钟搞定!

一、你的电脑是不是也总在“重复备份”?每次备份文件夹时,是不是总觉得“好麻烦”?特别是遇到几十G的文件库,整个备份过程像在坐过山车——明明大部分文件都没改,却还要从头来一遍!今天,我用Python开发...

几行代码教你zip打包

01准备有时我们不想去手动一个个去操作,然后傻等他打包完,python依赖库zipfile很方便地帮助我们封装了解压压缩,shutil用于文件目录处理,方法类似于linux命令。1、安装pipin...

Python操作目录

获取当前工作目录获取执行命令的位置路径拼接路径拆分文件重命名删除文件复制文件遍历文件夹下的文件判断文件是否存在判断目录是否存在获取当前工作目录importsysprint(sys.path[0]...

Python 开发工程师必会的 5 个系统命令操作库

当我们需要编写自动化脚本、部署工具、监控程序时,熟练操作系统命令几乎是必备技能。今天就来聊聊我在实际项目中高频使用的5个系统命令操作库,这些可都是能让你效率翻倍的"瑞士军刀"。一...

文件备份用Python,照着复制粘贴代码就可以了

引言在日常开发和运维工作中,数据安全尤为重要,定期备份重要文件是防范数据丢失的有效手段之一。本文将详细介绍如何使用Python实现一个简单的定时备份脚本,该脚本可以按照设定周期自动将指定文件夹或文件复...

2025年必学的Python自动化办公的15个实用脚本

2025年必学的Python自动化办公的6个实用脚本及其代码示例。这些脚本涵盖了文件备份、邮件通知、网页抓取、报告生成、数据处理和团队协作等多个场景,帮助用户高效完成日常办公任务。1.自动备份文件自...

一天学一点,今天学习掌握Python:异常处理与文件操作全攻略

这一笔记记录了我学习python的异常和文件的操作,这也是针对Python异常和文件操作教程的进一步优化建议和注意事项:异常处理优化1.避免过度捕获异常o不要为了捕获异常而捕获异常,应根据实际需求...

「亲测可用」如何用python脚本批量旋转图片为任意角度?

最近在训练图片方向分类器,需要对原始图片进行批量旋转操作,那如何用python脚本实现批量旋转图片为任意角度呢?此处,以将我的头像旋转90度为例进行演示。实现图片批量旋转的python源代码如下:#-...