Shutil 库 2025 使用教程
本文将详细讲解 shutil
库的基础知识、功能概览、创建和删除功能的深入剖析,并提供最佳实践建议。通过本文,你将能够全面掌握 shutil
模块的使用方法。
1. Shutil库的基础知识和功能概览
1.1 Shutil库的基本功能
shutil
是 Python 标准库中的一个模块,提供了对文件和文件集合进行高级操作的功能。其基本功能包括:
- 复制文件和目录 :
shutil.copy()
和shutil.copytree()
- 移动文件和目录 :
shutil.move()
- 删除文件和目录 :
shutil.rmtree()
- 压缩和解压文件 :
shutil.make_archive()
和shutil.unpack_archive()
2. Shutil库的创建功能深入剖析
bash
多级目录 parent_dir/sub_dir 已成功创建
2.3 文件的拷贝与移动
2.3.1 shutil.copy
函数的工作原理
shutil.copy
函数用于复制单个文件,保留元数据(如权限、时间戳等)。
代码示例:
python
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
函数分块读取和写入文件,以减少内存占用。
代码示例:
python
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
函数用于删除单个文件。
代码示例:
python
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 避免误删的安全措施
为了避免误删重要文件,可以在删除前进行确认提示或备份。
代码示例:
python
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')
输出结果:
bash
确定要删除文件 important_file.txt 吗? (y/n): y
文件 important_file.txt 已成功删除并备份为 important_file.txt.bak
高阶使用:
基于文件系统的批量操作
python
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. 项目备份工具
python
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. 大文件搬运工具
python
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. 智能文件分类器
python
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() 方法,支持设置缓冲区大小:
python
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() 支持多进程并行复制:
python
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. 权限和所有权
python
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. 元数据复制
python
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
来递归复制目录:
python
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
函数来递归地移动文件和目录:
python
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
函数来递归删除目录:
python
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()
获取当前工作目录,这对于脚本的相对路径操作尤为重要。
lua
import os
current_dir = os.getcwd()
print("当前工作目录:", current_dir)
3. 更改工作目录
通过os.chdir()
可以更改当前的工作目录,这对于批量操作特定目录下的文件很有帮助。
lua
os.chdir('/path/to/directory')
print("更改后的工作目录:", os.getcwd())
4. 创建新目录
os.mkdir()
和os.makedirs()
分别用于创建单级和多级目录。mkdir
只创建单级目录,而makedirs
可以递归创建多层目录。
bash
# 创建单级目录
os.mkdir("test_folder")
# 创建多级目录
os.makedirs("parent_folder/child_folder")
5. 删除目录
os.rmdir()
删除空目录,shutil.rmtree()
可以递归删除非空目录。要小心使用rmtree
,它会删除目录及其所有内容。
python
import shutil
# 删除空目录
os.rmdir("test_folder")
# 删除非空目录
shutil.rmtree("parent_folder")
6. 列出目录内容
通过os.listdir()
可以列出指定目录的内容(包括文件和子目录)。
lua
contents = os.listdir(".")
print("当前目录内容:", contents)
7. 文件与目录的判断
os.path
模块提供了一些函数判断路径是否存在,以及判断路径是文件还是目录。
lua
# 判断路径是否存在
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'
实现。
python
with open("new_file.txt", "w") as file:
file.write("Hello, World!")
print("文件创建并写入成功")
9. 删除文件
os.remove()
可以删除指定的文件,适合清理不再需要的临时文件。
lua
os.remove("new_file.txt")
print("文件已删除")
10. 复制文件
shutil.copy()
可以复制文件,shutil.copy2()
在复制文件的同时保留元数据(例如文件的创建时间和修改时间)。
bash
# 复制文件,不保留元数据
shutil.copy("source_file.txt", "destination_folder")
# 复制文件,保留元数据
shutil.copy2("source_file.txt", "destination_folder")
11. 复制目录
使用shutil.copytree()
可以递归复制整个目录及其内容。
bash
shutil.copytree("source_folder", "destination_folder")
print("目录已复制")
12. 移动文件和目录
shutil.move()
可以移动文件或目录,同时支持重命名操作。
arduino
# 移动文件
shutil.move("source_file.txt", "destination_folder")
# 移动并重命名文件
shutil.move("old_name.txt", "new_name.txt")
13. 重命名文件和目录
使用os.rename()
可以重命名文件和目录,支持指定旧名称和新名称。
lua
os.rename("old_name.txt", "new_name.txt")
print("文件已重命名")
14. 获取文件或目录的大小
os.path.getsize()
可以获取文件或目录的大小(字节为单位)。
lua
file_size = os.path.getsize("example.txt")
print("文件大小:", file_size, "字节")
15. 遍历目录结构:os.walk()
os.walk()
可以递归遍历目录,返回每一级目录的路径、子目录列表和文件列表。适用于文件搜索或批量处理文件。
bash
for root, dirs, files in os.walk("."):
print("当前路径:", root)
print("子目录:", dirs)
print("文件:", files)
16. 更改文件权限
os.chmod()
用于更改文件权限,例如设置文件为可读、可写或可执行。权限使用八进制数指定(例如,0o755
表示所有者可读、可写、可执行,其他人可读和可执行)。
bash
# 设置文件权限为可读写执行
os.chmod("example.txt", 0o755)
print("文件权限已修改")