Python创建tar.gz压缩包:标准库tarfile实战教程
用Python标准库tarfile创建tar.gz压缩包,支持gzip压缩、递归打包整个目录、排除指定文件类型,完整代码可运行。
场景痛点
在Linux服务器上部署项目或备份日志时,tar.gz是最常见的压缩格式。手动敲tar -zcvf命令参数多、容易写错,跨平台脚本里也不适合直接调系统命令。Python标准库tarfile原生支持tar.gz读写,跨Windows和Linux一致,适合写自动化备份脚本。
用到的库
tarfile # 标准库,读写tar/tar.gz
pathlib # 标准库
完整代码
import tarfile
from pathlib import Path
def create_tar_gz(source_dir: str, output_tar: str, exclude_suffix: list = None) -> str:
"""
创建tar.gz压缩包
:param source_dir: 要打包的源目录
:param output_tar: 输出的.tar.gz文件路径
:param exclude_suffix: 要排除的后缀列表,如 ['.log', '.tmp']
:return: 输出文件路径
"""
src = Path(source_dir).resolve()
out = Path(output_tar)
out.parent.mkdir(parents=True, exist_ok=True)
exclude_suffix = exclude_suffix or []
def filter_func(tarinfo):
# 排除指定后缀的文件
if Path(tarinfo.name).suffix.lower() in exclude_suffix:
return None # 返回None表示不打包该文件
return tarinfo
# 'w:gz' 表示写入并用gzip压缩;'w:bz2' 表示bzip2压缩率更高
with tarfile.open(out, 'w:gz') as tar:
# arcname 指定打包到压缩包内的顶层目录名,避免绝对路径
tar.add(src, arcname=src.name, filter=filter_func)
size_mb = out.stat().st_size / 1024 / 1024
print(f"打包完成: {out.resolve()} 大小: {size_mb:.2f} MB")
return str(out)
if __name__ == "__main__":
create_tar_gz(
source_dir="./myproject",
output_tar="./backup/myproject.tar.gz",
exclude_suffix=['.log', '.tmp', '.pyc']
)
代码讲解
tarfile.open(out, 'w:gz'):w:gz模式表示写入并启用gzip压缩。如果不要压缩只要tar包,用'w';想用bzip2高压缩率,用'w:bz2'。tar.add(src, arcname=src.name):把整个目录加进压缩包,arcname指定包内顶层目录名。不指定的话会带上源目录的绝对路径。filter_func:add时的过滤器回调,返回None表示跳过该文件。这里用来排除.log、.pyc等不需要打包的文件。out.stat().st_size:读取生成文件的字节数,换算成MB打印出来方便核对。
运行结果
运行后在backup/目录生成myproject.tar.gz。用tar -tzf myproject.tar.gz可以查看包内文件列表,或用tar -xzf解压验证。
注意事项
- tarfile在写入大文件时会一次性读入内存吗?不会,tarfile流式读写,GB级目录也不会爆内存。
- 中文文件名在Linux和Windows的tar实现里编码偶尔不一致。跨平台场景建议统一文件名用UTF-8,Python 3默认就是UTF-8。
- gzip是单线程压缩,CPU密集。如果只是备份不需要网络传输,用
'w'不压缩速度快很多,文件放在本地磁盘省的空间有限。 - 排除目录比排除文件麻烦,
filter_func里可以判断tarinfo.isdir()并按路径名排除node_modules这类目录。

更新时间:2026-09-14 21:21:42