原文链接: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)
- 可处理大于内存的超大文件
- 完整保留原始目录结构
注意事项:
- 符号链接处理需注意安全风险
- 不同压缩格式需对应正确模式字母
- 追加模式不支持压缩归档修改