烽天降临联盟-网游跨服战场活动门户

3.3Shutil 库使用教程(2025 最全最细)

7522

2025 Shutil 库使用教程(最全最细)

大家好!我是批量的小王子在撰写本文之前,我进行了广泛的资料搜集和研究,以确保内容的准确性和全面性。我搜索了多个网页和在线资源,查阅了大量的官方文档、技术博客以及社区讨论,以获取关于 shutil 库的最新信息和最佳实践。此外,我还结合了自己在实际开发中使用 shutil 库的经验,对一些常见操作和高级技巧进行了深入分析和总结。本文将详细讲解 shutil 库的基础知识、功能概览、创建和删除功能的深入剖析,并提供最佳实践建议.通过本文,你将能够全面掌握 shutil 模块的使用方法.

1. Shutil库的基础知识和功能概览

1.1 Shutil库的基本功能

shutil 是 Python 标准库中的一个模块,提供了对文件和文件集合进行高级操作的功能。其基本功能包括:

复制文件和目录:shutil.copy() 和 shutil.copytree()移动文件和目录:shutil.move()删除文件和目录:shutil.rmtree()压缩和解压文件:shutil.make_archive() 和 shutil.unpack_archive()

1.2 Shutil库的高级操作

除了基本功能外,shutil 还支持一些高级操作:

递归地复制整个目录树:shutil.copytree()递归地删除整个目录树:shutil.rmtree()创建和解压压缩包:shutil.make_archive() 和 shutil.unpack_archive()多线程/多进程处理大量文件:结合 concurrent.futures 模块

1.3 使用Shutil库的最佳实践

错误处理:使用 try-except 结构捕获并处理可能的异常。日志记录:使用 logging 模块记录文件操作的日志,便于调试和维护。避免误操作:在执行删除等不可逆操作前,确保路径正确且有备份。性能优化:对于大文件或大量文件的操作,考虑使用多线程或多进程来加速处理。

2. Shutil库的创建功能深入剖析

2.1 创建文件

2.1.1 open 函数的基本使用

open 函数用于打开文件,如果文件不存在则会创建新文件。

代码示例:

# 打开文件(如果不存在则创建)

with open('new_file.txt', 'w') as f:

f.write("这是一个新文件")

输出结果:

创建了一个名为 new_file.txt 的文件,并写入内容 "这是一个新文件"

2.1.2 with 语句的高级用法

with 语句可以确保文件在操作完成后自动关闭,避免资源泄漏。

代码示例:

# 使用 with 语句打开文件

with open('new_file.txt', 'a') as f:

f.write("\n这是追加的内容")

print("内容已成功追加到文件中")

输出结果:

内容已成功追加到文件中

2.2 创建目录

2.2.1 os.mkdir 函数的参数详解

os.mkdir 函数用于创建单个目录,如果父目录不存在则会抛出异常。

代码示例:

import os

# 创建单个目录

os.mkdir('new_directory')

print("目录 new_directory 已成功创建")

输出结果:

目录 new_directory 已成功创建

2.2.2 多级目录的创建方法

os.makedirs 函数用于递归地创建多级目录。

代码示例:

import os

# 创建多级目录

os.makedirs('parent_dir/sub_dir', exist_ok=True)

print("多级目录 parent_dir/sub_dir 已成功创建")

输出结果:

多级目录 parent_dir/sub_dir 已成功创建

2.3 文件的拷贝与移动

2.3.1 shutil.copy 函数的工作原理

shutil.copy 函数用于复制单个文件,保留元数据(如权限、时间戳等)。

代码示例:

import shutil

# 源文件路径

src_file = 'source.txt'

# 目标文件路径

dst_file = 'destination.txt'

# 复制文件

shutil.copy(src_file, dst_file)

print(f"文件 {src_file} 已成功复制到 {dst_file}")

输出结果:

文件 source.txt 已成功复制到 destination.txt

2.3.2 大文件拷贝的优化策略

对于大文件,可以使用 shutil.copyfileobj 函数分块读取和写入文件,以减少内存占用。

代码示例:

import shutil

# 源文件路径

src_file = 'large_source.txt'

# 目标文件路径

dst_file = 'large_destination.txt'

# 分块复制大文件

buffer_size = 1024 * 1024 # 1MB 缓冲区

with open(src_file, 'rb') as src, open(dst_file, 'wb') as dst:

shutil.copyfileobj(src, dst, buffer_size)

print(f"大文件 {src_file} 已成功复制到 {dst_file}")

输出结果:

大文件 large_source.txt 已成功复制到 large_destination.txt

3. Shutil库的删除功能实战演练

3.1 删除文件

3.1.1 os.remove 函数的直接应用

os.remove 函数用于删除单个文件。

代码示例:

import os

# 文件路径

file_to_remove = 'file_to_delete.txt'

# 删除文件

os.remove(file_to_remove)

print(f"文件 {file_to_remove} 已成功删除")

输出结果:

文件 file_to_delete.txt 已成功删除

3.1.2 避免误删的安全措施

为了避免误删重要文件,可以在删除前进行确认提示或备份。

代码示例:

import os

import shutil

def safe_remove(file_path):

try:

# 确认是否要删除文件

confirm = input(f"确定要删除文件 {file_path} 吗? (y/n): ")

if confirm.lower() == 'y':

shutil.move(file_path, f"{file_path}.bak") # 先备份

os.remove(file_path) # 再删除

print(f"文件 {file_path} 已成功删除并备份为 {file_path}.bak")

else:

print("取消删除操作")

except Exception as e:

print(f"发生错误: {e}")

safe_remove('important_file.txt')

输出结果:

确定要删除文件 important_file.txt 吗? (y/n): y

文件 important_file.txt 已成功删除并备份为 important_file.txt.bak

高阶使用:

基于文件系统的批量操作

import os

import shutil

from pathlib import Path

def batch_copy(src_dir, dst_dir, pattern="*"):

"""批量复制文件"""

src = Path(src_dir)

dst = Path(dst_dir)

dst.mkdir(exist_ok=True)

for file in src.glob(pattern):

if file.is_file():

shutil.copy2(file, dst / file.name)

print(f"Copied: {file.name}")

def batch_move(src_dir, dst_dir, pattern="*"):

"""批量移动文件"""

src = Path(src_dir)

dst = Path(dst_dir)

dst.mkdir(exist_ok=True)

for file in src.glob(pattern):

if file.is_file():

shutil.move(str(file), str(dst / file.name))

print(f"Moved: {file.name}")

def batch_delete(directory, pattern="*"):

"""批量删除文件"""

dir_path = Path(directory)

for file in dir_path.glob(pattern):

if file.is_file():

file.unlink()

print(f"Deleted: {file.name}")

# 使用示例

src = "source_dir"

dst = "destination_dir"

# 批量复制所有.txt文件

batch_copy(src, dst, "*.txt")

# 批量移动所有.jpg文件

batch_move(src, dst, "*.jpg")

# 批量删除所有.tmp文件

batch_delete(dst, "*.tmp")

1. 项目备份工具

import shutil

from datetime import datetime

import os

def backup_project(project_path, backup_dir="backups"):

# 创建以时间戳命名的备份文件

timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")

backup_name = f"backup_{timestamp}"

# 确保备份目录存在

os.makedirs(backup_dir, exist_ok=True)

# 创建压缩包

archive_path = shutil.make_archive(

os.path.join(backup_dir, backup_name),

"zip",

project_path

)

print(f"备份完成: {archive_path}")

2. 大文件搬运工具

import shutil

import os

from pathlib import Path

def move_large_files(src_dir, dst_dir, min_size_mb=100):

"""移动大于指定大小的文件到目标目录"""

dst_path = Path(dst_dir)

dst_path.mkdir(exist_ok=True)

for root, _, files in os.walk(src_dir):

for file in files:

file_path = Path(root) / file

if file_path.stat().st_size > min_size_mb * 1024 * 1024:

try:

shutil.move(str(file_path), dst_path / file)

print(f"已移动: {file}")

except Exception as e:

print(f"移动失败 {file}: {e}")

3. 智能文件分类器

import shutil

from pathlib import Path

import mimetypes

def organize_files(directory):

"""根据文件类型自动分类文件"""

directory = Path(directory)

# 遍历所有文件

for file_path in directory.rglob("*"):

if file_path.is_file():

# 获取文件类型

mime_type, _ = mimetypes.guess_type(str(file_path))

if mime_type:

category = mime_type.split("/")[0]

# 创建分类目录

dest_dir = directory / category

dest_dir.mkdir(exist_ok=True)

# 移动文件

try:

shutil.move(str(file_path), str(dest_dir / file_path.name))

except Exception as e:

print(f"处理{file_path}时出错: {e}")

对于大文件操作,shutil 提供了 copyfileobj() 方法,支持设置缓冲区大小:

with open("source.dat", "rb") as fsrc:

with open("dest.dat", "wb") as fdst:

shutil.copyfileobj(fsrc, fdst, length=1024*1024) # 1MB buffer

4.copytree() 支持多进程并行复制:

from multiprocessing import Pool

def copy_with_progress(src, dst):

shutil.copy2(src, dst)

return dst

with Pool(processes=4) as pool:

shutil.copytree("src_dir", "dst_dir", copy_function=pool.map)

5. 权限和所有权

import shutil

import os

def mirror_permissions(src, dst):

# 复制权限位

shutil.copymode(src, dst)

# 复制所有权(需要root权限)

try:

shutil.chown(dst,

user=os.stat(src).st_uid,

group=os.stat(src).st_gid)

except PermissionError:

print("需要管理员权限来修改所有权")

6. 元数据复制

import shutil

import os

from datetime import datetime

def show_metadata(path):

stat = os.stat(path)

print(f"访问时间: {datetime.fromtimestamp(stat.st_atime)}")

print(f"修改时间: {datetime.fromtimestamp(stat.st_mtime)}")

print(f"创建时间: {datetime.fromtimestamp(stat.st_ctime)}")

print(f"权限: {oct(stat.st_mode)[-3:]}")

print(f"大小: {stat.st_size} bytes")

# 复制文件并保留所有元数据

src = "source.txt"

dst = "dest.txt"

shutil.copy2(src, dst)

print("源文件元数据:")

show_metadata(src)

print("\n目标文件元数据:")

show_metadata(dst)

7. 文件操作的递归操作

shutil 模块提供了许多递归操作的函数,可以在文件操作中非常有用。这些函数可以递归地处理文件和目录,从而简化复杂的操作。

7.1. 递归复制

在 Python 中,使用 shutil.copytree(src, dst) 函数可以递归复制整个目录结构,包括子目录和文件。这个函数非常有用,可以将一个目录及其所有内容复制到另一个位置,保留了整个目录结构。

使用 shutil.copytree 来递归复制目录:

import shutil

# 源目录和目标目录

source_directory = "source_directory"

destination_directory = "destination_directory"

# 使用 copytree 复制源目录到目标目录

shutil.copytree(source_directory, destination_directory)

print(f"Directory '{source_directory}' has been recursively copied to '{destination_directory}'.")

在上面的示例中,source_directory 中的所有内容(包括子目录和文件)都会被递归复制到 destination_directory。可以在文件操作中保持目录结构的完整性。

7.2. 递归移动

shutil.move(src, dst) 函数可以用于递归地移动文件和目录,包括它们的子目录和内容。可以在不同目录之间移动文件和目录,并且可以用于重命名文件或目录。

使用 shutil.move 函数来递归地移动文件和目录:

import shutil

# 源目录或文件和目标目录或文件

source = "source_path"

destination = "destination_path"

# 使用 move 函数递归移动源到目标

shutil.move(source, destination)

print(f"'{source}' has been recursively moved to '{destination}'.")

source 可以是文件或目录,它及其内容将被递归地移动到 destination 。如果 destination 是目录,那么 source 将成为 destination 目录的子目录。如果 destination 是文件路径,那么 source将被移动并重命名为 destination。

7.3. 递归删除

shutil.rmtree(directory) 函数用于递归删除目录及其内容,包括子目录和文件。可以轻松地清理整个目录树。

使用 shutil.rmtree 函数来递归删除目录:

import shutil

# 要删除的目录

directory_to_delete = "directory_to_delete"

# 使用 rmtree 函数递归删除目录及其内容

shutil.rmtree(directory_to_delete)

print(f"Directory '{directory_to_delete}' has been recursively deleted.")

在上面的示例中,shutil.rmtree 函数会删除 directory_to_delete 目录以及其中的所有子目录和文件。这是一个非常有用的功能,特别需要清理或卸载不再需要的目录时。

最后总结和回顾

通过本文的介绍,你已经掌握了 shutil 模块的基础知识、创建和删除功能的深入剖析以及最佳实践。shutil 模块功能强大且易于使用,能够帮助你在 Python 中高效地管理文件和目录。希望这些内容对你有所帮助!

1. os模块和shutil模块简介

Python的os模块提供了与操作系统交互的多种功能,支持跨平台操作文件和目录。而shutil模块是os模块的一个补充,提供了一些高级的文件和目录操作,如复制、移动和删除等。

2. 获取当前工作目录

我们可以通过os.getcwd()获取当前工作目录,这对于脚本的相对路径操作尤为重要。

import os

current_dir = os.getcwd()

print("当前工作目录:", current_dir)

3. 更改工作目录

通过os.chdir()可以更改当前的工作目录,这对于批量操作特定目录下的文件很有帮助。

os.chdir('/path/to/directory')

print("更改后的工作目录:", os.getcwd())

4. 创建新目录

os.mkdir()和os.makedirs()分别用于创建单级和多级目录。mkdir只创建单级目录,而makedirs可以递归创建多层目录。

# 创建单级目录

os.mkdir("test_folder")

# 创建多级目录

os.makedirs("parent_folder/child_folder")

5. 删除目录

os.rmdir()删除空目录,shutil.rmtree()可以递归删除非空目录。要小心使用rmtree,它会删除目录及其所有内容。

import shutil

# 删除空目录

os.rmdir("test_folder")

# 删除非空目录

shutil.rmtree("parent_folder")

6. 列出目录内容

通过os.listdir()可以列出指定目录的内容(包括文件和子目录)。

contents = os.listdir(".")

print("当前目录内容:", contents)

7. 文件与目录的判断

os.path模块提供了一些函数判断路径是否存在,以及判断路径是文件还是目录。

# 判断路径是否存在

exists = os.path.exists("some_folder")

# 判断是否为文件

is_file = os.path.isfile("some_file.txt")

# 判断是否为目录

is_dir = os.path.isdir("some_folder")

print("路径存在:", exists, "是否为文件:", is_file, "是否为目录:", is_dir)

8. 创建新文件

在Python中可以使用open()函数来创建新文件,通过指定写模式'w'或'a'实现。

with open("new_file.txt", "w") as file:

file.write("Hello, World!")

print("文件创建并写入成功")

9. 删除文件

os.remove()可以删除指定的文件,适合清理不再需要的临时文件。

os.remove("new_file.txt")

print("文件已删除")

10. 复制文件

shutil.copy()可以复制文件,shutil.copy2()在复制文件的同时保留元数据(例如文件的创建时间和修改时间)。

# 复制文件,不保留元数据

shutil.copy("source_file.txt", "destination_folder")

# 复制文件,保留元数据

shutil.copy2("source_file.txt", "destination_folder")

11. 复制目录

使用shutil.copytree()可以递归复制整个目录及其内容。

shutil.copytree("source_folder", "destination_folder")

print("目录已复制")

12. 移动文件和目录

shutil.move()可以移动文件或目录,同时支持重命名操作。

# 移动文件

shutil.move("source_file.txt", "destination_folder")

# 移动并重命名文件

shutil.move("old_name.txt", "new_name.txt")

13. 重命名文件和目录

使用os.rename()可以重命名文件和目录,支持指定旧名称和新名称。

os.rename("old_name.txt", "new_name.txt")

print("文件已重命名")

14. 获取文件或目录的大小

os.path.getsize()可以获取文件或目录的大小(字节为单位)。

file_size = os.path.getsize("example.txt")

print("文件大小:", file_size, "字节")

15. 遍历目录结构:os.walk()

os.walk()可以递归遍历目录,返回每一级目录的路径、子目录列表和文件列表。适用于文件搜索或批量处理文件。

for root, dirs, files in os.walk("."):

print("当前路径:", root)

print("子目录:", dirs)

print("文件:", files)

16. 更改文件权限

os.chmod()用于更改文件权限,例如设置文件为可读、可写或可执行。权限使用八进制数指定(例如,0o755表示所有者可读、可写、可执行,其他人可读和可执行)。

# 设置文件权限为可读写执行

os.chmod("example.txt", 0o755)

print("文件权限已修改")