pin_drop当前位置:知识文库 ❯ 图文

Python shutil.make_archive详解 - 目录打包归档教程

一、概述

shutil.make_archive() 用于创建归档文件(如 zip、tar、gztar 等),将指定目录打包压缩为一个归档文件。它支持多种归档格式,是快速打包目录的标准工具。


二、语法与参数说明

语法

代码示例

import shutil

shutil.make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, dry_run=0, owner=None, group=None, logger=None)

参数说明

参数 类型 默认值 说明
base_name str 必填 归档文件名(不含扩展名)
format str 必填 归档格式:zip/tar/gztar/bztar/xztar
root_dir str None 归档的根目录
base_dir str None 归档的起始目录
verbose int 0 详细程度
dry_run int 0 试运行模式
owner str None 归档文件所有者
group str None 归档文件所属组
logger Logger None 日志记录器

返回值

返回归档文件的完整路径字符串。


三、代码示例

示例1:创建ZIP归档

代码示例

import shutil
import os

# 创建测试目录
os.makedirs('myproject/src', exist_ok=True)
with open('myproject/README.md', 'w') as f:
    f.write('# My Project')
with open('myproject/src/main.py', 'w') as f:
    f.write('print("hello")')

# 创建ZIP归档
archive_path = shutil.make_archive('myproject_backup', 'zip', root_dir='.', base_dir='myproject')
print(f"归档路径: {archive_path}")
print(f"归档存在: {os.path.exists(archive_path)}")

# 清理
os.remove(archive_path)
shutil.rmtree('myproject')

输出:

代码示例

归档路径: e:\...\myproject_backup.zip
归档存在: True

示例2:不同归档格式

代码示例

import shutil
import os

os.makedirs('data_dir', exist_ok=True)
with open('data_dir/config.yaml', 'w') as f:
    f.write('key: value')

# 查看支持的格式
formats = shutil.get_archive_formats()
print("支持的归档格式:")
for fmt, desc in formats:
    print(f"  {fmt}: {desc}")

# 创建不同格式的归档
zip_path = shutil.make_archive('data_zip', 'zip', base_dir='data_dir')
print(f"\nZIP: {zip_path}")

# 清理
os.remove(zip_path)
shutil.rmtree('data_dir')

输出:

代码示例

支持的归档格式:
  zip: ZIP file
  tar: uncompressed tar file
  gztar: gzip'ed tar file
  bztar: bzip2'ed tar file
  xztar: xz'ed tar file

ZIP: e:\...\data_zip.zip

示例3:项目发布打包

代码示例

import shutil
import os

# 模拟项目结构
os.makedirs('release/src', exist_ok=True)
os.makedirs('release/docs', exist_ok=True)
with open('release/src/app.py', 'w') as f:
    f.write('# Application code')
with open('release/docs/guide.md', 'w') as f:
    f.write('# User Guide')
with open('release/setup.py', 'w') as f:
    f.write('# Setup script')

# 创建发布包
archive = shutil.make_archive(
    base_name='app_v1.0',
    format='gztar',
    root_dir='.',
    base_dir='release'
)
print(f"发布包: {archive}")
print(f"文件大小: {os.path.getsize(archive)} 字节")

# 清理
os.remove(archive)
shutil.rmtree('release')

输出:

代码示例

发布包: e:\...\app_v1.0.tar.gz
文件大小: 256 字节

四、实际应用场景

  • 项目备份:定期将项目目录打包为归档文件,便于存储和传输。

  • 发布打包:将构建产物打包为 zip 或 tar.gz 格式,用于软件发布。

  • 数据归档:将历史数据目录压缩归档,节省磁盘空间。


五、注意事项

注意1base_name 不包含扩展名,make_archive() 会根据 format 自动添加。

注意2root_dir 是归档的根目录,base_dir 是相对于 root_dir 的起始目录。两者配合使用可以控制归档的目录结构。

注意3:如果目标归档文件已存在,会被覆盖。

提示zip 格式跨平台兼容性最好,gztar 压缩率更高。根据目标平台选择合适格式。


六、归档方法对比

对比项 make_archive zipfile模块 tarfile模块 手动压缩
易用性 最高
格式支持 多种 ZIP TAR系列 取决于实现
目录打包 一行代码 需递归 需递归 需递归
灵活性 最高
适用场景 快速打包 ZIP定制 TAR定制 特殊需求

七、小结

  • make_archive() 快速创建目录归档文件,支持 zip/tar/gztar 等格式

  • base_name 不含扩展名,扩展名根据格式自动添加

  • root_dirbase_dir 配合控制归档的目录结构

  • zip 格式兼容性最好,gztar 压缩率更高


八、练习题

练习1

编写一个函数,将指定目录打包为带日期的 zip 归档文件,如 backup_20260411.zip

练习2

对比 zip 和 gztar 格式的压缩率和创建速度,编写基准测试。

练习3

使用 dry_run=1 模拟归档操作,观察输出而不实际创建文件。


常见问题

base_name 需要包含扩展名吗?

不需要。base_name 参数不应该包含扩展名,make_archive() 会根据 format 参数自动添加对应的扩展名。例如 format='zip' 时会自动添加 .zip 后缀。

root_dir 和 base_dir 有什么区别?

root_dir 是归档的根目录,base_dir 是相对于 root_dir 的起始目录。如果只设置 base_dir,归档会以 base_dir 为根。如果同时设置两者,归档会以 root_dir 为根,但只打包 base_dir 指定的子目录,这样可以控制归档内的目录结构。

make_archive 支持哪些压缩格式?

默认支持 zip、tar、gztar、bztar、xztar 五种格式。可以使用 shutil.get_archive_formats() 查看当前系统支持的所有格式。zip 跨平台兼容性最好,gztar 压缩率较高。

如何只测试归档而不实际创建文件?

可以设置 dry_run=1 参数。此时 make_archive 会模拟归档操作并返回归档文件路径,但不会实际创建文件。这在调试和验证归档配置时非常有用。

归档时如何排除特定文件或目录?

make_archive 本身不支持排除功能。如果需要排除某些文件,可以先将需要打包的内容复制到一个临时目录(排除不需要的文件),然后对临时目录进行归档;或者使用 zipfile/tarfile 模块手动控制要包含的文件。

标签: shutil make_archive 文件归档 ZIP压缩 项目打包 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python shutil.move详解 - 移动文件和目录的实用教程 下一篇: Python shutil.unpack_archive详解 - 解压归档文件教程

poll相关推荐