news 2026/5/29 4:03:39

shutil,一个文件操作的 Python 库!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
shutil,一个文件操作的 Python 库!

在日常的计算机使用中,文件与目录的复制、移动、删除、压缩是最常见不过的操作。比如:你需要定期把工作文件夹备份到移动硬盘;写一个脚本自动整理凌乱的桌面,将图片、文档分别归入不同目录;或者批量重命名并移动几百个照片文件。这些任务如果手动完成既繁琐又易错,而 Python 的shutil(Shell Utilities 的缩写)模块正是为此而生。它是对底层操作系统文件操作命令(如cpmvrmtar)的高级封装,提供了跨平台的、更安全、更易用的接口。有了shutil,你只需一行shutil.copy(src, dst)就能实现文件复制,shutil.rmtree(path)可以递归删除整个目录树,甚至shutil.make_archive()能把文件夹打包成 zip 或 tar 文件。无论是编写数据备份脚本、构建自动化部署工具,还是日常清理下载文件夹,shutil都能让你用 Python 轻松驾驭文件系统。

安装

shutil是 Python 的标准库模块,因此不需要单独安装。只需确保 Python 环境(Python 3.x)已正确安装,即可通过import shutil直接使用。它依赖底层的操作系统 API,在 Windows、Linux、macOS 上均能无缝运行。

基本用法

下面分 4 个小步骤演示shutil的核心操作。

1. 复制文件

python

import shutil # 复制文件(保留权限信息,但不保留元数据如创建时间) shutil.copy('source.txt', 'destination.txt') # 复制文件并保留元数据(如修改时间) shutil.copy2('source.txt', 'dest_with_meta.txt') # 复制文件到目标目录(保持原文件名) shutil.copy('source.txt', './backup_folder/')

2. 复制整个目录

python

# 递归复制整个目录树(目标目录必须不存在,否则报错) shutil.copytree('src_folder', 'dst_folder') # 复制时忽略某些文件或目录 shutil.copytree('src', 'dst', ignore=shutil.ignore_patterns('*.pyc', '__pycache__'))

3. 移动文件或目录

python

# 移动文件/目录(类似于 mv 命令) shutil.move('old_location.txt', 'new_location.txt') # 也可以用来重命名(如果目标在同一父目录下) shutil.move('data.csv', 'backup.csv')

4. 删除目录

python

# 删除一个非空目录及其所有内容(危险操作,谨慎使用) shutil.rmtree('temp_folder') # 更安全的删除:先检查是否存在 if shutil.os.path.exists('temp_folder'): shutil.rmtree('temp_folder')

高级用法

shutil还提供了一些更强大的功能,适合复杂场景。

  • 磁盘使用情况查询:获取文件系统剩余空间和总空间,便于在备份前检查磁盘容量。

python

total, used, free = shutil.disk_usage('/home') print(f"总空间: {total // (2**30)} GB, 剩余: {free // (2**30)} GB")
  • 创建归档文件make_archive可以将整个文件夹打包成 zip、tar、gztar 等格式,无需额外依赖。

python

# 将 'my_documents' 打包为 'backup.zip' 放在当前目录 archive_path = shutil.make_archive('backup', 'zip', 'my_documents') print(f"归档文件创建于: {archive_path}") # 支持格式:'zip', 'tar', 'gztar', 'bztar', 'xztar'
  • 解压归档文件unpack_archive能自动识别格式并解压。

python

shutil.unpack_archive('backup.zip', extract_dir='./restored')
  • 自定义复制回调函数:在复制大文件或目录时显示进度。

python

def progress_copied(src, dst, *args, **kwargs): print(f"正在处理: {src} -> {dst}") shutil.copytree('big_folder', 'big_folder_copy', copy_function=shutil.copy2, ignore_dangling_symlinks=True, dirs_exist_ok=True) # 注意:shutil.copytree 在 Python 3.8+ 支持 dirs_exist_ok 参数,允许覆盖已有目录
  • 文件权限与所有权shutil.copymode(src, dst)只复制权限,shutil.copystat(src, dst)复制权限和元数据。

实际应用场景

  1. 定期自动备份项目文件夹:假设你每天需要将~/projects备份到外接硬盘的backups目录,并带日期后缀。

python

import shutil from datetime import datetime def backup_project(project_path, backup_root): project_name = shutil.os.path.basename(project_path) timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') backup_name = f"{project_name}_{timestamp}" backup_dest = shutil.os.path.join(backup_root, backup_name) shutil.copytree(project_path, backup_dest) print(f"备份完成: {backup_dest}") backup_project('/home/user/projects/awesome_app', '/media/external/backups')
  1. 整理下载文件夹:自动将下载目录中的文件按扩展名移动到不同文件夹,并清理空目录。

python

from pathlib import Path import shutil downloads = Path.home() / 'Downloads' for item in downloads.iterdir(): if item.is_file(): ext = item.suffix[1:].lower() if item.suffix else 'no_ext' dest_dir = downloads / ext dest_dir.mkdir(exist_ok=True) shutil.move(str(item), str(dest_dir / item.name)) elif item.is_dir() and not any(item.iterdir()): item.rmdir() # 删除空目录
  1. 批量图片格式转换前的预处理:你需要将所有.png文件复制到一个临时文件夹,进行转换后再移动回来。利用shutil.copy2保留原时间戳。

python

import shutil from pathlib import Path src_dir = Path('originals') tmp_dir = Path('tmp_convert') tmp_dir.mkdir(exist_ok=True) for png in src_dir.glob('*.png'): shutil.copy2(png, tmp_dir / png.name) # ... 在这里进行图像转换操作 ... # 转换完成后,移动回原目录并覆盖 for converted in tmp_dir.glob('*.png'): shutil.move(str(converted), str(src_dir / converted.name)) shutil.rmtree(tmp_dir)
  1. 构建项目发布包:用shutil.make_archive打包代码,同时忽略.git和测试文件夹。

python

import shutil import tempfile with tempfile.TemporaryDirectory() as tmpdir: # 将项目复制到临时目录,排除不必要的文件 shutil.copytree('my_project', f'{tmpdir}/my_project', ignore=shutil.ignore_patterns('.git', '__pycache__', '*.pyc', 'tests')) # 创建归档 shutil.make_archive('my_project_release', 'gztar', tmpdir, 'my_project') print("发布包生成完毕: my_project_release.tar.gz")

结尾

shutil作为 Python 标准库中的文件操作专家,几乎覆盖了所有我们日常需要的文件系统操作。它既简洁又强大,无需调用外部命令就能完成跨平台的文件复制、移动、删除、打包等任务。从简单的数据备份到复杂的自动化部署流水线,shutil都能成为你脚本中的得力助手。相比于直接使用os.system('cp ...')shutil提供了更好的异常处理和可读性,避免了 shell 注入风险。

最后,想问问你:在你的实际工作中,是否遇到过由于磁盘空间不足导致备份失败,或者需要实现“增量复制”(只复制新增或修改的文件)的场景?你知道如何结合shutilfilecmp模块来实现更智能的同步吗?欢迎在评论区分享你的经验和挑战,我们一起探讨更高效的文件管理方案!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 4:01:36

贴牌定制自有 AI短剧创作系统,品牌形象独立营收全权把控

一、通用系统弊端,制约长期发展很多入局 AI 短剧领域的从业者,初期会选择公共版、共享版系统,看似起步简单,却暗藏诸多局限。 首先品牌归属权缺失,对外运营始终依附第三方品牌,无法打造自身口碑与影响力&am…

作者头像 李华
网站建设 2026/5/29 3:58:14

别再踩坑了!手把手教你用YOLOv5 v6.0 + ONNX在Ubuntu 20.04的ROS上部署目标检测(附VMware虚拟机USB摄像头连接完整流程)

YOLOv5 v6.0与ONNX在ROS中的避坑部署指南:从虚拟机配置到实时检测全流程第一次在Ubuntu 20.04的ROS环境中部署YOLOv5目标检测模型时,我遇到了无数令人抓狂的问题——从权重版本不匹配导致的诡异报错,到虚拟机USB摄像头死活识别不出来&#xf…

作者头像 李华
网站建设 2026/5/29 3:57:43

Codex Desktop安装配置教程:本地+远程服务器全攻略

下载安装Codex Desktop 首先从官方渠道下载Codex Desktop:https://developers.openai.com/codex/quickstart 根据自己的电脑系统下载对应的安装包,按照安装向导完成安装。 配置本地Codex环境 Codex Desktop安装完成后, 如果直接启动&…

作者头像 李华
网站建设 2026/5/29 3:57:11

为什么你的Claude响应延迟飙至12s?揭秘token调度器隐式瓶颈与3种动态批处理调优方案(附Prometheus监控看板模板)

更多请点击: https://kaifayun.com 第一章:Claude技术选型建议 在构建基于 Claude 的智能应用时,技术选型需兼顾 API 稳定性、响应延迟、上下文处理能力与企业级安全合规要求。Anthropic 提供的官方 API 是首选接入方式,而非第三…

作者头像 李华
网站建设 2026/5/29 3:54:53

北斗导航“指路”申通西安转运中心让特产寄递跑出“加速度”

近期,随着北斗导航智能系统的全面升级,申通快递西安转运中心的快递货车装上“智慧大脑”。不仅让物流链路跑得更准、更稳,更让西安本地的各类特色产品寄递效率大幅提升,为陕西地区的特产外销和日常寄递带来了实实在在的便利。在申…

作者头像 李华