Python学习系列 -初探标准库之Shutil库

文章开篇

Python的魅力,犹如星河璀璨,无尽无边;人生苦短、我用Python!


Python其强大的标准库和丰富的第三方库,恰似一片生机勃勃的森林,为开发者们提供了源源不断的资源和支持;
在这片广袤的“森林”中,隐藏着许多Python标准库中的珍贵模块,如os、sys、re等;它们如同森林中的璀璨明珠,熠熠生辉,为开发者的工作提供着不可或缺的支持
在Python的生态系统中,有许多备受赞誉的第三方库,如NumPy、Pandas、openpyxl、requests、selenium、pyqt等,这些库如同森林中的珍稀物种,以其独特的功能和卓越的性能,助力开发者们更高效地完成工作;
无论是处理字符串、读写文件这样的基础任务,还是并发编程、数据分析等高级挑战,Python的标准库和三方库都能应对自如,满足各种需求;


shutil标准库简介

os 标准库在 Python 中扮演着文件和目录管理的基石角色
os 标准库提供了新建、删除文件或目录,以及查看文件属性等基础功能;
os 标准库还提供了路径操作,如绝对路径的获取、父目录的查询等;
然而,当涉及到文件的高级操作时,如移动、复制、打包、压缩和解压等,os 模块就显得力不从心
这些功能对于日常的文件管理至关重要,但os模块并未直接提供,这也正是 shutil 模块存在的意义;
作为 os 模块的有力补充,shutil 提供了一系列针对文件和目录的高级操作功能,如文件的复制、移动、重命名、打包、压缩和解压等;
通过 shutil 模块,可以执行以下等操作:

  • 复制文件
  • 递归复制目录
  • 移动文件
  • 递归移动目录
  • 递归删除目录
  • 压缩文件
  • 解压文件

在这里插入图片描述


复制文件

shutil.copy(src, dst) 函数用于将源文件复制到目标位置
src 参数:必须是文件,否则抛出异常:IsADirectoryError: [Errno 21] Is a directory;
dst 参数:如果是目录就直接复制过去,否则进行重命名后复制过去;

import shutil

# 复制文件
path1 = "/Users/PythonWorkspace/第49课:第三方库/CASE06:Pathlib/temp.xlsx"
path2 = '/Users/PythonWorkspace/第49课:第三方库/CASE07:Shutil'
shutil.copy(path1, path2)   # 将path1路径下的temp.xlsx文件复制到当前目录

# 重命名后复制文件
path3 = '/Users/PythonWorkspace/第49课:第三方库/CASE07:Shutil/rename_temp.xlsx'
shutil.copy(path1, path3)   # 将path1路径下的temp.xlsx文件复制到当前目录并重命名

递归复制目录

shutil.copytree(src, dst) 函数用于递归地复制整个目录结构
src参数:源目录,必须是目录,否则抛出异常:NotADirectoryError: [Errno 20] Not a directory;
dst参数:目标路径,必须是不存在的目录,否则抛出异常:FileExistsError: [Errno 17] File exists;

import shutil

path1 = "/Users/PythonWorkspace/第49课:第三方库/CASE06:Pathlib"
path2 = '/Users/PythonWorkspace/第49课:第三方库/CASE07:Shutil/TEMP_CASE06:Pathlib'
shutil.copytree(path1, path2)   # 将path1路径完整的复制到path2中

path3 = '/Users/PythonWorkspace/第49课:第三方库/CASE07:Shutil/temp.xlsx'
# path3 是一个文件路径,如果temp.xlsx不存在,则会被生成目录,否则抛出异常FileExistsError: [Errno 17] File exists


移动文件

shutil.move(src, dst) 函数用于重命名文件或将文件或目录从一个位置移动到另一个位置
src 参数:源目录必须存在,否则抛出异常:FileNotFoundError: [Errno 2] No such file or directory
dst 参数:目标文件或目录可以不存在,如果是目录就直接移动过去,否则进行重命名后移动过去

import shutil

# 移动文件
path1 = "/Users/yangkai/PythonWorkspace/第49课:第三方库/CASE06:Pathlib/temp.xlsx"
path2 = '/Users/yangkai/PythonWorkspace/第49课:第三方库/CASE07:Shutil/temp.xlsx'
shutil.move(path1, path2)   # 将path1的temp.xlsx文件移动到path2路径下,path1将不存在

# 重命名文件后移动文件
path3 = '/Users/yangkai/PythonWorkspace/第49课:第三方库/CASE07:Shutil/rename_temp.xlsx'
shutil.move(path2, path1)   # 再移动回去,做一个测试
shutil.move(path1, path3)   # 同copy()方法一致,dst 参数如果是目录就直接移动过去,否则进行重命名后移动过去


递归移动目录

shutil.move(src, dst) 函数用于重命名文件或将文件或目录从一个位置移动到另一个位置
src 参数:源目录必须存在,否则抛出异常:FileNotFoundError: [Errno 2] No such file or directory
dst 参数:目标文件或目录可以不存在,如果是目录就直接移动过去,否则进行重命名后移动过去

import shutil

# 移动目录
path4 = "/Users/yangkai/PythonWorkspace/第49课:第三方库/CASE06:Pathlib"
path5 = '/Users/yangkai/PythonWorkspace/第49课:第三方库/CASE07:Shutil'
shutil.move(path4, path5)   # 和copytree()方法不同,dst 参数可以为已存在的目录

# 重命名目录后移动
path6 = '/Users/yangkai/PythonWorkspace/第49课:第三方库/CASE06:Pathlib_Temp'
shutil.move(path4, path6)   # 将源目录进行重命名后移动

删除文件

shutile标准库中没有提供对文件进行删除的方法,仍需要使用os标准库的方法;


递归删除目录

os 标准库中提供的删除目录方法是不允许删除非空目录的,而shutil可以删除
shutil.rmtree(directory) 函数用于递归地删除目录及其内容;
directory 参数:必须是存在目录,否则抛出异常:FileNotFoundError: [Errno 2] No such file or directory;

import shutil

path1 = "/Users/yangkai/PythonWorkspace/第49课:第三方库/CASE07:Shutil/test_1"

shutil.rmtree(path1)    # test_1目录以及其子文件子目录将全部被删除


文件或目录重命名

上述示例中无论是copy()方法还是move()方法都能够实现重命名,但不要忘记os.rename()哟


获取支持的压缩格式

import shutil

types = shutil.get_archive_formats()

for idx, _type in enumerate(types):
    print(f"No.{idx}: {_type}")
    # No.0: ('bztar', "bzip2'ed tar-file")
    # No.1: ('gztar', "gzip'ed tar-file")
    # No.2: ('tar', 'uncompressed tar file')
    # No.3: ('xztar', "xz'ed tar-file")
    # No.4: ('zip', 'ZIP file')

压缩

import shutil
import os

# 要压缩的文件夹路径
source_folder = 'example_folder'

# 压缩文件的保存路径和名称
archive_name = 'example_archive'
archive_path = os.path.join(os.getcwd(), archive_name)  # 利用 os 模块的 getcwd() 函数获取绝对路径

# 使用shutil.make_archive创建压缩文件
shutil.make_archive(archive_name, 'zip', source_folder)

print(f"压缩文件已创建:{archive_path}")    # 在实际目录下会多出.zip的后缀


解压

import shutil
import os

# 压缩文件的路径
archive_path = 'example_archive.zip'

# 解压目标路径,这里设置为当前工作目录
extract_path = os.getcwd()

# 使用shutil.unpack_archive解压文件
shutil.unpack_archive(archive_path, extract_path)

print(f"压缩文件已解压到:{extract_path}")


实际应用


1.复制整个目录结构
import shutil
import os

def copy_directory(src_dir, dst_dir):
    """
    复制整个目录结构,包括子目录和文件。

    :param src_dir: 源目录路径
    :param dst_dir: 目标目录路径
    """
    # 检查源目录是否存在
    if not os.path.exists(src_dir):
        raise ValueError(f"源目录 {src_dir} 不存在")

    # 检查目标目录是否存在,如果存在则删除它(可以选择性地添加备份功能)
    if os.path.exists(dst_dir):
        shutil.rmtree(dst_dir)

    # 复制目录结构
    shutil.copytree(src_dir, dst_dir)

    print(f"目录 {src_dir} 已成功复制到 {dst_dir}")


2.备份目录

import shutil
import os
import datetime

def backup_directory(src_dir, backup_dir, prefix='backup'):
    """
    备份整个目录到指定位置,并在文件名中包含日期戳。

    :param src_dir: 要备份的源目录
    :param backup_dir: 备份文件存放的目录
    :param prefix: 备份文件的前缀名
    """
    # 确保源目录存在
    if not os.path.exists(src_dir):
        raise ValueError(f"源目录 {src_dir} 不存在")

    # 确保备份目录存在,如果不存在则创建
    if not os.path.exists(backup_dir):
        os.makedirs(backup_dir)

    # 获取当前日期时间,用于生成唯一的备份文件名
    now = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
    backup_filename = f"{prefix}_{now}.zip"
    backup_path = os.path.join(backup_dir, backup_filename)

    # 使用shutil创建目录的zip归档
    shutil.make_archive(backup_filename, 'zip', src_dir, backup_dir)

    print(f"目录 {src_dir} 已成功备份到 {backup_path}")

3.移动文件并重命名
import shutil
import os

def move_and_rename_file(src_file, dst_dir, new_filename):
    """
    移动文件到指定目录并重命名。

    :param src_file: 要移动的源文件路径
    :param dst_dir: 目标目录路径
    :param new_filename: 新文件名
    """
    # 确保源文件存在
    if not os.path.exists(src_file):
        raise ValueError(f"源文件 {src_file} 不存在")

    # 确保目标目录存在,如果不存在则创建
    if not os.path.exists(dst_dir):
        os.makedirs(dst_dir)

    # 构建目标文件路径
    dst_file = os.path.join(dst_dir, new_filename)

    # 移动并重命名文件
    shutil.move(src_file, dst_file)

    print(f"文件 {src_file} 已成功移动到 {dst_file}")

总结

Shutil 模块是 Python 中用于高效、灵活处理文件和目录的重要工具,提供复制、移动、重命名、删除等功能,并支持递归处理目录结构
通过深入学习和使用 shutil,可以提升代码效率和可维护性

  • 28
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要休息的KK.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值