百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python内置tarfile模块:读写 tar 归档文件详解

off999 2025-09-13 07:46 2 浏览 0 评论

一、学习目标

1.1 学习目标

掌握Python内置模块tarfile的核心功能,包括:

  • 理解tar归档文件的原理与常见压缩格式(gzip/bz2/lzma)
  • 掌握tar文件的读写操作(创建、解压、查看、过滤)
  • 熟悉安全防护机制(解压过滤器)与跨平台兼容性(Unicode处理)
  • 能够在实际项目中灵活应用(如日志归档、软件包分发、数据备份)

1.2 知识导图(Mermaid)


二、tarfile模块基础

2.1 模块概述

tarfile是Python标准库中用于处理tar归档文件的内置模块,支持读写未压缩/压缩的tar文件(如.tar、.tar.gz、.tar.bz2等)。其核心价值在于:

  • 归档管理:将多个文件/目录打包为单一文件(保留元数据)
  • 压缩集成:通过扩展名自动处理gzip/bz2/lzma压缩
  • 跨平台兼容:支持POSIX标准与Windows系统

2.2 常见tar格式对比(表1)

格式类型

常量名

特点

创建支持

读取支持

POSIX.1-1988

USTAR_FORMAT

文件名≤256字符,链接名≤100字符,最大8GB

GNU扩展

GNU_FORMAT

支持长文件名/链接名、>8GB文件、稀疏文件(仅读取)

POSIX.1-2001

PAX_FORMAT

无限制(UTF-8元数据)、跨平台兼容(默认格式)

:Python 3.8+默认使用PAX_FORMAT(更安全灵活)


三、核心功能

3.1 文件操作基础

3.1.1 打开tar文件:tarfile.open()

功能:通过指定模式打开tar文件(读/写/追加/创建),支持压缩格式自动处理。

原型

tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)

参数说明

  • name:文件路径(如archive.tar.gz)
  • mode:操作模式(见表2)
  • fileobj:可选的二进制文件对象(如open('file.bin', 'rb'))
  • **kwargs:压缩相关参数(如compresslevel=9)

模式对照表(表2)

模式

说明

压缩类型

'r'

读取未压缩tar

'r:gz'

读取gzip压缩的tar

gzip

'w:gz'

创建gzip压缩的tar

gzip

'x:bz2'

创建bz2压缩的tar(文件不存在时)

bz2

'a'

追加到未压缩tar(文件不存在则创建)

示例代码(PEP8风格)

import tarfile

# 读取gzip压缩的tar文件
with tarfile.open('data.tar.gz', 'r:gz') as tar:
    tar.list()  # 列出所有成员

# 创建bz2压缩的tar文件
with tarfile.open('backup.tar.bz2', 'w:bz2') as tar:
    tar.add('project/')  # 添加目录

3.1.2 检查文件类型:tarfile.is_tarfile()

功能:快速判断文件是否为有效的tar归档。

if tarfile.is_tarfile('archive.tar'):
    print("是有效的tar文件")

3.2 读操作

3.2.1 获取成员信息

  • getmember(name):获取指定名称的成员元数据(TarInfo对象)
  • getmembers():返回所有成员的TarInfo列表
  • getnames():返回所有成员名称的字符串列表

示例:查看tar内文件详情

with tarfile.open('docs.tar', 'r') as tar:
    for member in tar.getmembers():
        print(f"名称: {member.name}, 大小: {member.size}字节, 类型: {'目录' if member.isdir() else '文件'}")

3.2.2 解压操作

  • extractall(path='.', members=None, filter='data'):解压所有/指定成员到目标路径
  • extract(member, path=''):解压单个成员

安全要点

  • 必须指定filter参数(Python 3.12+默认要求):防止路径遍历攻击(如../../../恶意文件)
  • 推荐使用filter='data'(跨平台安全)或自定义过滤函数

实用案例:安全解压Python脚本

import tarfile
import os

def is_python_file(member):
    return member.name.endswith('.py')  # 只解压.py文件

with tarfile.open('scripts.tar.gz', 'r:gz') as tar:
    tar.extractall(path='extracted', members=filter(is_python_file, tar.getmembers()), filter='data')

3.3 写操作

3.3.1 添加文件/目录

  • add(name, arcname=None, recursive=True, filter=None):添加文件或目录(递归默认开启)
  • addfile(tarinfo, fileobj=None):通过TarInfo对象直接添加

编程技巧

  • 使用arcname重命名归档内的路径(如arcname='config/settings.ini')
  • 通过filter函数修改元数据(如统一设置用户权限)

示例:创建带过滤的归档

import tarfile
import time

def reset_metadata(tarinfo):
    tarinfo.uid = tarinfo.gid = 0      # 设置为root用户
    tarinfo.uname = tarinfo.gname = 'root'
    tarinfo.mtime = int(time.time())   # 更新修改时间为当前
    return tarinfo

with tarfile.open('config.tar.gz', 'w:gz') as tar:
    tar.add('settings.ini', arcname='app/config.ini', filter=reset_metadata)

3.3.2 直接创建TarInfo对象

通过gettarinfo()生成元数据,再配合addfile()添加内容:

tarinfo = tarfile.gettarinfo('data.bin', arcname='assets/data.bin')
with open('data.bin', 'rb') as f:
    tar.addfile(tarinfo, fileobj=f)  # 需手动提供文件对象

四、解压过滤器

4.1 为什么需要过滤?

tar格式允许存储绝对路径(如/etc/passwd)和路径遍历(如../../恶意文件),攻击者可能通过恶意归档覆盖系统关键文件。

4.2 过滤器类型(表3)

过滤器名称

行为描述

适用场景

'fully_trusted'

完全信任归档元数据(允许绝对路径/符号链接等危险特性)

仅限绝对可信源

'tar'

允许大部分tar特性,但阻止明显危险操作(如绝对路径去除斜杠)

一般内部使用

'data'

仅提取文件数据,忽略所有权限/路径等元数据(最安全)

跨平台数据分发

Python 3.14+默认使用'data'过滤器!

示例:强制安全解压

# 方式1:通过参数指定
tar.extractall(filter='data')

# 方式2:通过属性设置(影响后续所有操作)
tar.extraction_filter = tarfile.data_filter

五、应用与扩展

5.1 命令行工具

Python内置命令行接口,快速操作tar文件:

# 创建归档
python -m tarfile -c backup.tar /path/to/files

# 解压到指定目录
python -m tarfile -e archive.tar.gz ./extracted

# 列出文件
python -m tarfile -l data.tar

5.2 实用技巧

  • 内存优化:处理大文件时使用stream=True模式(避免缓存全部元数据)
  • 错误处理:设置errorlevel=2捕获非致命错误(如权限不足)
  • 跨平台路径:始终使用os.path.join()构造路径,避免硬编码/或\

六、学习总结

6.1 核心知识点回顾

  1. tarfile模块:Python标准库,支持读写tar归档及gzip/bz2/lzma压缩
  2. 关键对象: TarFile:管理归档文件(打开/关闭/读写) TarInfo:存储文件元数据(名称/大小/权限/类型)
  3. 安全实践:必须使用解压过滤器(推荐filter='data')
  4. 常见场景:日志归档、软件包分发、配置备份

6.2 推荐实践路径

6.3 常见问题解答

Q:为什么解压时提示DeprecationWarning?
A:Python 3.12+要求显式指定filter参数(默认不再信任归档),需添加filter='data'。

Q:如何处理超大型tar文件?
A:使用stream=True模式(减少内存占用),或分批次处理成员(通过生成器过滤)。

Q:tar与zip格式如何选择?
A:tar适合保留Unix权限/符号链接(归档场景),zip更适合跨平台通用分发(内置压缩)。


#编程# #学习# #python# #在头条记录我的2025#

相关推荐

大文件传不动?WinRAR/7-Zip 入门到高手,这 5 个技巧让你效率翻倍

“这200张照片怎么传给女儿?微信发不了,邮箱附件又超限……”62岁的张阿姨对着电脑犯愁时,儿子只用了3分钟就把照片压缩成一个文件,还教她:“以后用压缩软件,比打包行李还方便!”职场人更懂这...

电脑解压缩软件推荐——7-Zip:免费、高效、简洁的文件管理神器

在日常工作中,我们经常需要处理压缩文件。无论是下载软件包、接收文件,还是存储大量数据,压缩和解压缩文件都成为了我们日常操作的一部分。而说到压缩解压软件,7-Zip绝对是一个不可忽视的名字。今天,我就来...

设置了加密密码zip文件要如何打开?这几个方法可以试试~

Zip是一种常见的压缩格式文件,文件还可以设置密码保护。那设置了密码的Zip文件要如何打开呢?不清楚的小伙伴一起来看看吧。当我们知道密码想要打开带密码的Zip文件,我们需要用到适用于Zip格式的解压缩...

大文件想要传输成功,怎么把ZIP文件分卷压缩

不知道各位小伙伴有没有这样的烦恼,发送很大很大的压缩包会受到限制,为此,想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置?方法一:使用7-Zip免费且强大的文件管理工具7...

高效处理 RAR 分卷压缩包:合并解压操作全攻略

在文件传输和存储过程中,当遇到大文件时,我们常常会使用分卷压缩的方式将其拆分成多个较小的压缩包,方便存储和传输。RAR作为一种常见的压缩格式,分卷压缩包的使用频率也很高。但很多人在拿到RAR分卷...

2个方法教你如何删除ZIP压缩包密码

zip压缩包设置了加密密码,每次解压文件都需要输入密码才能够顺利解压出文件,当压缩包文件不再需要加密的时候,大家肯定想删除压缩包密码,或是忘记了压缩包密码,想要通过删除操作将压缩包密码删除,就能够顺利...

速转!漏洞预警丨压缩软件Winrar目录穿越漏洞

WinRAR是一款功能强大的压缩包管理器,它是档案工具RAR在Windows环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从Internet上下载的RAR、ZIP及其它类...

文件解压方法和工具分享_文件解压工具下载

压缩文件减少文件大小,降低文件失效的概率,总得来说好处很多。所以很多文件我们下载下来都是压缩软件,很多小伙伴不知道怎么解压,或者不知道什么工具更好,所以今天做了文件解压方法和工具的分享给大家。一、解压...

[python]《Python编程快速上手:让繁琐工作自动化》学习笔记3

1.组织文件笔记(第9章)(代码下载)1.1文件与文件路径通过importshutil调用shutil模块操作目录,shutil模块能够在Python程序中实现文件复制、移动、改名和删除;同时...

Python内置tarfile模块:读写 tar 归档文件详解

一、学习目标1.1学习目标掌握Python内置模块tarfile的核心功能,包括:理解tar归档文件的原理与常见压缩格式(gzip/bz2/lzma)掌握tar文件的读写操作(创建、解压、查看、过滤...

使用python展开tar包_python拓展

类Unix的系统,打包文件经常使用的就是tar包,结合zip工具,可以方便的打包并解压。在python的标准库里面有tarfile库,可以方便实现生成了展开tar包。使用这个库最大的好处,可能就在于不...

银狐钓鱼再升级:白文件脚本化实现GO语言后门持久驻留

近期,火绒威胁情报中心监测到一批相对更为活跃的“银狐”系列变种木马。火绒安全工程师第一时间获取样本并进行分析。分析发现,该样本通过阿里云存储桶下发恶意文件,采用AppDomainManager进行白利...

ZIP文件怎么打开?2个简单方法教你轻松搞定!

在日常工作和生活中,我们经常会遇到各种压缩文件,其中最常见的格式之一就是ZIP。ZIP文件通过压缩数据来减少文件大小,方便我们进行存储和传输。然而,对于初学者来说,如何打开ZIP文件可能会成为一个小小...

Ubuntu—解压多个zip压缩文件.zip .z01 .z02

方法将所有zip文件放在同一目录中:zip_file.z01,zip_file.z02,zip_file.z03,...,zip_file.zip。在Zip3.0版本及以上,使用下列命令:将所有zi...

如何使用7-Zip对文件进行加密压缩

7-Zip是一款开源的文件归档工具,支持多种压缩格式,并提供了对压缩文件进行加密的功能。使用7-Zip可以轻松创建和解压.7z、.zip等格式的压缩文件,并且可以通过设置密码来保护压缩包中的...

取消回复欢迎 发表评论: