Python轮子:压缩文件神器tarfile

原文链接:http://www.juzicode.com/python-module-tarfile

Python的tarfile模块是标准库中用于处理TAR归档文件的工具,提供了创建、读取、提取和操作TAR文件的功能,支持多种压缩格式(gzip, bzip2, lzma),适用于跨平台归档操作。

应用场景

  • 软件源代码分发(如Linux内核)
  • 日志文件归档与压缩存储
  • 科学数据集打包
  • 网站备份与迁移
  • 跨平台文件传输
  • 保留文件元数据(权限/时间戳)

模块导入

import tarfile
from tarfile import TarFile, open, TarInfo

基本使用方法

1)创建TAR归档

# juzicode.com/VX公众号:juzicode
import tarfile

# 创建带gzip压缩的TAR文件
with tarfile.open('project.tar.gz', 'w:gz') as tar:
    tar.add('src/', arcname='source')  # 添加目录
    tar.add('requirements.txt')       # 添加文件
    
print("TAR归档创建成功")

运行结果:生成project.tar.gz文件,包含src目录(归档为source)和requirements.txt

2)读取TAR文件内容

# juzicode.com/VX公众号:juzicode
import tarfile

# 读取TAR文件
with tarfile.open('project.tar.gz', 'r:gz') as tar:
    # 列出归档内容
    print("归档成员:")
    for member in tar.getmembers():
        print(f"- {member.name} ({member.size}字节)")
    
    # 提取单个文件内容
    config = tar.extractfile('source/config.yaml')
    print("\n配置文件内容:", config.read().decode()[:50] + "...")

运行结果:输出归档文件列表和部分文件内容

3)解压TAR文件

# juzicode.com/VX公众号:juzicode
import tarfile
import os

# 创建解压目录
os.makedirs('extracted', exist_ok=True)

# 解压整个归档
with tarfile.open('project.tar.gz', 'r:gz') as tar:
    tar.extractall('extracted')
    
print("文件解压成功,保留原始权限结构")

运行结果:在extracted目录生成原始文件结构

4)验证TAR文件完整性

# juzicode.com/VX公众号:juzicode
import tarfile

def verify_tar(tar_path):
    try:
        with tarfile.open(tar_path) as tar:
            # 测试读取所有文件
            for member in tar:
                if not member.isfile():
                    continue
                f = tar.extractfile(member)
                f.read()
        print("归档验证通过")
    except tarfile.TarError as e:
        print(f"归档损坏: {e}")

verify_tar('project.tar.gz')

5)处理不同压缩格式

# juzicode.com/VX公众号:juzicode
import tarfile

# 创建不同压缩格式的归档
formats = {
    'gzip': 'w:gz',
    'bzip2': 'w:bz2',
    'lzma': 'w:xz',
    '无压缩': 'w'
}

for name, mode in formats.items():
    with tarfile.open(f'demo_{name}.tar', mode) as tar:
        tar.add('data.csv')
    print(f"{name}格式归档创建成功")

运行结果:生成demo_gzip.tar, demo_bzip2.tar等不同格式文件

总结

tarfile模块核心优势:

  • 支持多种压缩算法(gzip/bzip2/xz)
  • 可处理大于内存的超大文件
  • 完整保留原始目录结构

注意事项:

  • 符号链接处理需注意安全风险
  • 不同压缩格式需对应正确模式字母
  • 追加模式不支持压缩归档修改

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注