【Python进阶】shutil
本文最后更新于20 天前,其中的信息可能已经过时,如有错误请发送邮件到linmwo@qq.com

在日常的 Python 开发中,我们经常需要对文件和文件夹进行复制、移动、压缩等操作。虽然 os 模块也能完成部分功能,但它更偏向底层,操作相对繁琐。而 shutil(shell utility)模块则提供了更高级、更方便的文件操作方法。

本文将总结 shutil 的常用功能,并通过示例帮助你快速掌握它。


1. 基本文件操作

1.1 复制文件

  • 复制文件shutil.copy(src, dst)
  • 复制文件并保留权限shutil.copy2(src, dst)
import shutil

shutil.copy("test.txt", "backup.txt")       # 复制文件内容
shutil.copy2("test.txt", "backup2.txt")     # 复制文件+元数据(修改时间、权限等)

注意dst 可以是目录,此时会自动使用 src 文件名作为目标文件名。


1.2 复制整个目录

  • 复制目录shutil.copytree(src, dst, dirs_exist_ok=False)
shutil.copytree("my_folder", "my_folder_backup")
  • 如果目标目录存在,Python 3.8+ 可以用 dirs_exist_ok=True
shutil.copytree("my_folder", "my_folder_backup", dirs_exist_ok=True)

1.3 移动或重命名文件/目录

  • 移动(或重命名)shutil.move(src, dst)
shutil.move("test.txt", "archive/test.txt")

如果 dst 是目录,则移动到该目录;如果是文件名,则相当于重命名。


1.4 删除目录

  • 递归删除shutil.rmtree(path)
shutil.rmtree("temp_folder")

注意rmtree 会直接删除整个目录树,不可恢复,使用前务必确认!


2. 高级文件操作

2.1 文件描述符复制

shutil.copyfileobj(fsrc, fdst, length=16*1024)
适用于打开的文件对象之间的复制:

with open("source.txt", "rb") as fsrc, open("target.txt", "wb") as fdst:
    shutil.copyfileobj(fsrc, fdst)

可以指定 length 来控制缓冲区大小,提高大文件复制效率。


2.2 获取磁盘空间

total, used, free = shutil.disk_usage("/")
print(f"总空间: {total // (1024**3)} GB")
print(f"已用空间: {used // (1024**3)} GB")
print(f"可用空间: {free // (1024**3)} GB")

2.3 查找可执行文件

path = shutil.which("python")
print(path)  # 例如:C:\Python39\python.exe

3. 压缩与解压

shutil 提供了快速的压缩/解压工具(底层基于 zipfiletarfile)。

3.1 压缩目录

shutil.make_archive("backup", "zip", "my_folder")
# 生成 backup.zip,包含 my_folder 的所有内容

参数:

  • 第1个参数:生成文件名(不带扩展名)
  • 第2个参数:压缩格式(zip、tar、gztar、bztar、xztar)
  • 第3个参数:要打包的目录

3.2 解压文件

shutil.unpack_archive("backup.zip", "restore_folder")

自动识别压缩格式并解压到 restore_folder


4. 实用技巧

4.1 仅复制目录结构(不复制文件)

有时只想复制目录树,可以这样做:

import os

def copy_structure(src, dst):
    for root, dirs, files in os.walk(src):
        for d in dirs:
            new_dir = os.path.join(dst, os.path.relpath(os.path.join(root, d), src))
            os.makedirs(new_dir, exist_ok=True)

copy_structure("my_folder", "empty_structure")

4.2 目录同步(覆盖更新)

shutil.copytree("src_folder", "dst_folder", dirs_exist_ok=True)

适用于做增量更新


4.3 临时文件管理

搭配 tempfile 模块,可用来做临时拷贝备份

import tempfile

with tempfile.TemporaryDirectory() as tmpdir:
    shutil.copy("test.txt", tmpdir)
    print("已拷贝到临时目录:", tmpdir)
# 退出 with 后,临时目录会被自动删除

5. 总结

shutil 是对 os高层封装,能大幅简化文件管理操作:

  • 文件/目录:复制、移动、删除
  • 压缩/解压:快速打包和解压
  • 实用工具:磁盘使用情况、查找可执行文件

备份、自动化脚本、运维工具等场景中非常实用。


推荐练习:

  1. 实现一个文件夹备份工具:支持 zip 打包 + 时间戳命名。
  2. 写个磁盘监控脚本:当磁盘剩余空间低于阈值时报警。
  3. 目录同步器:基于 copytree(dirs_exist_ok=True) 做增量更新。

Views: 0

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇