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)参数说明
返回值
返回归档文件的完整路径字符串。
三、代码示例
示例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 格式,用于软件发布。
-
数据归档:将历史数据目录压缩归档,节省磁盘空间。
五、注意事项
注意1:
base_name不包含扩展名,make_archive()会根据format自动添加。
注意2:
root_dir是归档的根目录,base_dir是相对于root_dir的起始目录。两者配合使用可以控制归档的目录结构。
注意3:如果目标归档文件已存在,会被覆盖。
提示:
zip格式跨平台兼容性最好,gztar压缩率更高。根据目标平台选择合适格式。
六、归档方法对比
七、小结
-
make_archive()快速创建目录归档文件,支持 zip/tar/gztar 等格式 -
base_name不含扩展名,扩展名根据格式自动添加 -
root_dir和base_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 模块手动控制要包含的文件。
本文涉及AI创作
内容由AI创作,请仔细甄别