文章开篇
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,可以提升代码效率和可维护性。