Python利用shutil实现文件拷贝与目录管理

今天早睡
今天早睡
发布时间:2026-10-12 | 2人浏览过
原创

Python内置的 shutil 模块提供了高效的路径、文件及压缩归档操作方法。本文详解 copy、copyfile、copytree 等核心函数的参数区别与使用场景,涵盖保留元信息的复制策略、递归目录处理、跨系统移动清理以及打包解压流程,帮助开发者快速掌握自动化文件管理方案。

shutil 模块核心定位

在 Python 标准库中,os 负责底层系统调用,而 shutil 则专注于高级文件与目录操作。它封装了拷贝、移动、删除、压缩与解压等高频任务,无需依赖第三方库即可满足大多数自动化脚本需求。

基础文件复制:copy 与 copyfile

日常开发中最常用的是 copy(),它会同时复制文件数据与权限信息,并返回新文件的绝对路径。

import shutil

# 将 1.txt 复制到目标路径
target_path = shutil.copy("src/1.txt", "dst/test.txt")
print(target_path)

参数说明:

  • src:源文件路径(必须是文件);
  • dst:目标路径。若为已存在的目录,文件会被放入该目录;若不存在或不是目录,则会创建/覆盖对应文件;
  • follow_symlinks=True:是否跟随软链接。设为 False 时,若源是软链接,将在目标位置重建相同的软链接。

若只需纯数据拷贝且不关心权限,可使用更底层的 copyfile(src, dst)。其限制在于:dst 必须是一个可写入的文件路径,不能是目录,否则会抛出 PermissionError。此外,copy 与 copyfile 均会生成新文件的时间戳。若需完整保留原文件的修改时间与属性,应改用 copy2()。

目录级备份与递归复制

当需要整文件夹搬家时,copytree() 是首选工具。它支持递归遍历并可根据条件过滤文件。

import shutil
from pathlib import Path

# 基础用法:src 必须存在,dst 不能存在
src_dir = Path("/data/source")
dst_dir = Path("/data/backup")
shtutil.copytree(str(src_dir), str(dst_dir))

关键参数控制:

  • ignore=shutil.ignore_patterns("*.log", "~*"):排除特定后缀或临时文件;
  • dirs_exist_ok=False:Python 3.8+ 新增参数。设为 True 时允许目标目录已存在,重复文件会正常覆盖;
  • symlinks=True:决定是否复制链接本身还是链接指向的实际文件(默认跟随)。;

文件移动、覆盖与目录清理

move() 用于重命名或转移文件。其行为高度依赖目标状态:

import shutil

# dst 不存在 → 等效于 rename()
shutil.move("old_file.txt", "new_file.txt")

# dst 存在且为目录 → 移入该目录
shutil.move("app.log", "/logs/archive/")

# dst 存在且为文件 → 强制覆盖 src
shutil.move("temp.csv", "final.csv")

注意:当源与目标处于不同文件系统(如跨盘符或不同挂载点)时,move() 会退化为“先复制后删除”的流程,可能显著增加 I/O 开销。此时建议使用专门的拷贝函数并手动清理。

安全删除整个目录树

rmtree() 可递归清空指定文件夹。由于操作不可逆且会连带清除隐藏文件,执行前务必确认路径无误,生产环境中建议先对快照进行备份。

import shutil

# 谨慎操作:确认 target_dir 内容已归档后再执行
shutil.rmtree("/tmp/cache_folder", ignore_errors=True)

归档压缩与解压操作

自动化备份离不开压缩工具链。make_archive() 将目录打包为 ZIP 或 TAR 系列格式:

import shutil

# 格式参数可选:zip, tar, gztar, bztar, xztar
shutil.make_archive("/backup/config_2024", "gztar", 
                    root_dir="/etc/app/config")

root_dir 决定了压缩包内部根目录结构。若只想打包单个子目录且不改变解压后的外层名称,需配合 base_dir 参数调整。解包则直接使用 unpack_archive(filename, extract_dir),系统会自动根据扩展名识别格式。

其他实用辅助函数

除核心搬运逻辑外,shutil 还提供多项运维相关工具:

  • disk_usage(path):返回包含总容量、已用、剩余字节数的命名元组,适合编写磁盘监控脚本;
  • which(cmd, mode=os.F_OK | os.X_OK):查找环境变量中的可执行程序路径,返回 None 表示未找到;
  • get_terminal_size():获取当前终端列数与行数,便于控制台输出自适应排版。

总结

通过合理组合 copy 族函数、copytree 递归过滤与 make_archive 打包接口,能够构建出稳定可靠的自动化备份管线。实际项目中建议结合 pathlib 进行路径拼接,并在执行 rmtree 或跨设备移动前增加完整性校验,以规避数据丢失风险。以上就是 Python 利用 shutil 实现文件拷贝与目录管理的详细内容,更多关于 Python 系统操作与数据备份的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表