Shutil 库 2025 使用教程python在处理excel方面具有非常优秀的功能,可以根据实际业务流程需要进行精准定制exe执行文件,一键批理提取数据,提

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}")
  1. 对于大文件操作,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("文件权限已修改")

相关推荐
棋丶1 小时前
VUE2和VUE3的区别
开发语言·前端·javascript
screct_demo2 小时前
详细讲一下Vue的路由Vue Router的安装,配置,基础用法和详细用法以及实践中应用
前端·javascript·vue.js
PieroPc2 小时前
特制一个自己的UI库,只用CSS、图标、emoji图 日后慢用!!!
javascript·css·ui
He guolin3 小时前
[Vue]的快速上手
前端·javascript·vue.js
艾斯特_4 小时前
window.open 被浏览器拦截解决方案
前端·javascript
_nut_4 小时前
Redis中的主从/Redis八股
javascript·redis·bootstrap
zlting~5 小时前
【VUE】a链接下载跨域文件直接打开而非下载(解决办法)
前端·javascript·vue.js
nyf_unknown5 小时前
(vue)给循环遍历的el-select选择框加全选/清空/反选,禁选,添加行移除行功能
前端·javascript·vue.js
夏兮颜☆5 小时前
【react-pdf】实现在线pdf加载——翻页加载和下拉滚动加载
javascript·react.js·pdf
一颗不甘坠落的流星5 小时前
【React】刷新页面或跳转路由时进行二次确认
前端·javascript·react.js