Python中shutil模块怎么使用

发布时间:2022-01-24 15:38:50 作者:zzz
来源:亿速云 阅读:156
# Python中shutil模块怎么使用

## 一、shutil模块简介

`shutil`(shell utility)是Python标准库中用于高级文件操作的模块,提供了对文件和文件夹的复制、移动、删除等操作。与`os`模块相比,`shutil`提供了更高层次的文件操作接口,特别适合处理文件和目录的批量操作。

## 二、常用功能概览

| 功能分类       | 主要方法                     |
|----------------|----------------------------|
| 文件复制       | `copy()`, `copy2()`, `copyfile()` |
| 目录操作       | `copytree()`, `rmtree()`    |
| 文件移动/重命名| `move()`                   |
| 归档压缩       | `make_archive()`, `unpack_archive()` |

## 三、文件复制操作

### 1. 基础文件复制

```python
import shutil

# 复制文件内容(不保留元数据)
shutil.copy('source.txt', 'destination.txt')

# 复制文件并保留元数据(如修改时间)
shutil.copy2('source.txt', 'destination.txt')

# 仅复制文件内容(必须指定目标文件名)
shutil.copyfile('source.txt', 'dest_folder/new_name.txt')

区别对比: - copy(): 复制内容+部分权限 - copy2(): 复制内容+完整元数据 - copyfile(): 仅复制内容

2. 目录复制

# 递归复制整个目录树
shutil.copytree('src_dir', 'dst_dir')

# 忽略特定文件类型
def ignore_pyc(dirname, filenames):
    return [name for name in filenames if name.endswith('.pyc')]
    
shutil.copytree('src', 'dst', ignore=ignore_pyc)

四、文件移动与删除

1. 移动文件/目录

# 移动文件(可用于重命名)
shutil.move('old_location.txt', 'new_folder/new_name.txt')

# 移动目录
shutil.move('old_dir', 'new_parent_dir/renamed_dir')

2. 删除目录树

# 递归删除整个目录(危险操作!)
shutil.rmtree('directory_to_delete')

# 安全删除(Python 3.12+)
shutil.rmtree('dir', onexc=handle_errors)

五、归档与压缩

1. 创建归档文件

# 创建zip/tar归档
shutil.make_archive(
    'archive_name', 
    'zip',        # 格式:zip/tar/gztar等
    'root_dir'    # 要归档的目录
)

2. 解压归档文件

shutil.unpack_archive('package.zip', 'extract_dir')

六、高级用法

1. 自定义复制行为

def custom_copy(src, dst):
    print(f"Copying {src} to {dst}")
    return shutil.copy2(src, dst)

shutil.copy2 = custom_copy

2. 磁盘空间检查

total, used, free = shutil.disk_usage('/')
print(f"Free space: {free // (2**30)} GB")

七、异常处理

import errno

try:
    shutil.copytree('src', 'dst')
except shutil.Error as e:
    print(f"Directory not copied: {e}")
except OSError as e:
    if e.errno == errno.ENOSPC:
        print("Disk full!")

八、性能优化技巧

  1. 大文件处理:对于超大文件,建议使用copyfileobj()分块复制

    with open('bigfile.iso', 'rb') as src:
       with open('copy.iso', 'wb') as dst:
           shutil.copyfileobj(src, dst, length=16*1024)  # 16KB块
    
  2. 选择性复制:使用ignore参数避免复制不必要的文件

  3. 跨设备操作:移动文件时注意不同文件系统的处理

九、实际应用案例

案例1:备份项目目录

import datetime

def backup_project(project_path):
    timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M")
    backup_name = f"backup_{timestamp}.zip"
    shutil.make_archive(backup_name[:-4], 'zip', project_path)
    print(f"Backup created: {backup_name}")

案例2:清理临时文件

def clean_temp(temp_dir, days=7):
    cutoff = time.time() - days * 86400
    for filename in os.listdir(temp_dir):
        filepath = os.path.join(temp_dir, filename)
        if os.path.getmtime(filepath) < cutoff:
            if os.path.isfile(filepath):
                os.remove(filepath)
            else:
                shutil.rmtree(filepath)

十、注意事项

  1. 权限问题:操作可能需要管理员权限
  2. 符号链接:默认会跟随链接,可通过copy(..., follow_symlinks=False)修改
  3. 跨平台差异:Windows和Unix系统路径处理不同
  4. 资源占用:大目录操作可能消耗大量内存

十一、总结

shutil模块作为Python文件操作的”瑞士军刀”,提供了: - 简洁的高级文件操作API - 完整的目录树处理能力 - 跨平台兼容性 - 与os模块的良好互补

掌握shutil能显著提升文件处理效率,但需注意其不可逆操作的风险,建议重要操作前先进行测试。

官方文档推荐:
Python shutil文档 “`

注:本文实际约1600字,完整版可扩展以下内容: 1. 更多异常处理示例 2. 与pathlib的结合使用 3. 性能基准测试数据 4. 特殊文件系统(如网络存储)的处理

推荐阅读:
  1. Python 之 shutil模块使用
  2. python内置模块~shutil

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python shutil

上一篇:JVM堆外内存怎么实现

下一篇:Linux系统中怎么安装SQL server

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》