Python的tarfile模块解压缩.tar/.tar.gz等文件
off999 2025-07-02 23:53 3 浏览 0 评论
python中的标准库tarfile模块可以帮助我们快速压缩或者解压后缀为
.tar/.tar.gz/.tar.bz2/.tar.xz的文件。
01、tarfile核心类与函数介绍
使用方法
因为tarfile是标准库,我们直接import tarfile即可使用。
tarfile模块的核心是TarFile类,通过它可以完成创建、读取、修改 tar 文件的操作。但在实际使用中我们经常使用tarfile.open函数,open函数其实调用的是tarfile.TarFile.open类函数,源代码如下:
open类函数比TarFile类本身支持更多的mode。
1. tarfile.open(name, mode='r', fileobj=None, **kwargs)
功能:打开或创建一个tar文件,返回TarFile对象。
参数:
- name:tar文件名(如'archive.tar')。
- mode:打开模式,常见取值:'r':以只读模式打开已存在的tar文件。'w':创建新的tar文件并覆盖原有内容。'a':以追加模式打开tar文件。结合压缩格式:'w:gz':表示使用gzip压缩),'w:bz2':表示使用bzip2压缩 ,'w:xz':表示使用lzma压缩。
- fileobj:文件对象(可选),若指定则使用该对象进行操作。
案例:创建不同格式的压缩文件,不同的压缩算法压缩后的文件大小是不同的。
import tarfile
with tarfile.open('example.tar', 'r') as tar:
pass
with tarfile.open('example.tar.gz', 'w:gz') as tar:
pass
with tarfile.open('example.tar.bz2', 'w:bz2') as tar:
pass
with tarfile.open('example.tar.xz', 'w:xz') as tar:
pass
#追加文件到已有的压缩文件
with tarfile.open('existing.tar', 'a') as tar:
tar.add('new_file.txt')
2. TarFile.add(name, arcname=None, recursive=True, filter=None)
功能:将文件或目录添加到tar文件中。
参数解析:
name
- 作用:指定要归档的文件或目录路径。
with tarfile.open('example.tar.bz2', 'w:bz2') as tar:
tar.add('/home/user/data.csv') # 绝对路径
tar.add('docs/README.md') # 相对路径
arcname
- 作用:设置文件在tar包中的归档名称(默认为原路径)。
with tarfile.open('example.tar.bz2', 'w:bz2') as tar:
# 将本地文件归档为archive.tar中的data/input.csv
tar.add('input.csv', arcname='data/input.csv')
recursive
- 作用:是否递归归档目录内容(仅对目录有效),默认递归处理所有子目录。
with tarfile.open('example.tar.bz2', 'w:bz2') as tar:
# 仅归档src目录本身,不包含其内容
tar.add('src', recursive=False)
filter(Python 3.8+增加的参数,以前的版本是exclude参数)
- 作用:filter函数接收一个TarInfo对象,返回修改后的对象或None(排除该文件);使用时会对每个TarInfo对象进行转换或过滤。
案例1: 修改文件属性
def set_permissions(tarinfo):
tarinfo.mode = 0o644 # 设置文件权限
return tarinfo
with tarfile.open('example.tar.bz2', 'w:bz2') as tar:
tar.add('scripts', filter=set_permissions)
案例2 :基于条件过滤文件
def exclude_large_files(tarinfo):
if tarinfo.size > 1024 * 1024: # 大于1MB的文件
print(f"排除大文件: {tarinfo.name}")
return None
return tarinfo
with tarfile.open('example.tar.bz2', 'w:bz2') as tar:
tar.add('logs/', filter=exclude_large_files)
案例3: 动态修改归档路径
def remap_path(tarinfo):
tarinfo.name = tarinfo.name.replace('src/', 'source/')
return tarinfo
with tarfile.open('example.tar.bz2', 'w:bz2') as tar:
tar.add('src/', filter=remap_path)
filter参数 vs exclude参数说明:
特性 | filter (Python 3.8+) | exclude (旧版) |
参数类型 | 处理TarInfo的函数 | 判断路径的函数 |
功能 | 修改或排除文件 | 仅排除文件 |
灵活性 | 高(可修改元数据) | 低(仅路径判断) |
兼容性 | Python 3.8+ | 所有版本 |
3. TarFile.extractall(path='.', members=None, *, numeric_owner=False)
功能:解压tar文件中的所有内容到指定路径。
参数:
- path:解压目标路径(默认当前目录)。
- members:指定解压的成员列表(默认解压全部)。
- numeric_owner:是否使用数字用ID和组ID(默认False)。
案例:解压tar.gz全部的文件
import tarfile
with tarfile.open('project.tar.gz', 'r:gz') as tar:
tar.extractall('extracted_project')
4. TarFile.getmembers()
功能:返回tar文件中所有成员的TarInfo对象列表,TarInfo对象包含了文件的详细元数据,如文件名、大小、修改时间等 。
import tarfile
with tarfile.open('project.tar', 'r') as tar:
members_info = tar.getmembers()
for info in members_info:
print(f"文件名: {info.name}, 大小: {info.size}字节")
print(f"修改时间: {info.mtime}, 权限: {info.mode}")
或者使用TarFile.gettarinfo函数获取单个文件的TarInfo对象,此处不在赘述。
5. TarFile.getnames()
功能:返回tar文件中所有成员的名称列表。
import tarfile
with tarfile.open('project2.tar.gz', 'r') as tar:
print(tar.getnames())
6. TarFile.extract(member, path='.')
功能:解压指定的单个文件或目录。参数member填文件名或者带路径的文件名,如果找不到路径会报错。path默认解压到当前目录。
with tarfile.open('project2.tar.gz', 'r') as tar:
tar.extract('dir1/Python从入门到精通.pdf',path='1/2') #将单个文件解压到某一个目录
7.内存中操作 tar 文件
使用io.BytesIO可以在内存中创建和操作 tar 文件,无需写入磁盘。
import tarfile
import io
buffer = io.BytesIO()
#使用fileobj参数
with tarfile.open(fileobj=buffer, mode='w') as tar:
tar.add('data.txt')
# 获取内存中的tar数据
tar_data = buffer.getvalue().decode()
print(tar_data)
02 函数总结
功能场景 | 核心函数 / 方法 | 关键参数 / 注意事项 |
创建 tar 文件 | TarFile.open('name.tar', 'w') | 选择合适的压缩模式(如'w:gz') |
添加文件 / 目录 | TarFile.add() | arcname可重命名归档路径 |
解压文件 | TarFile.extract() / extractall() | 指定正确的目标路径 |
遍历文件列表 | TarFile.getmembers() / getnames() | 用于检查归档内容 |
追加文件 | TarFile.open('name.tar', 'a') | 避免文件名冲突 |
03 注意事项
在windows环境下,执行压缩后,如果在电脑上直接打开,会发现中文显示乱码。
此时可以通过tarfile的解压函数extractall解压,然后再查看中文显示正常。
相关推荐
- python基础模块三剑客:sys、os、shutil(增加示例代码)
-
注:上个篇由于不熟悉头条号编辑器,导致示例代码丢失。现在全部以图片的形式加回。有同学问了个问题:在python里如何复制、删除、重命名文件?有个同学知道os.system(),就回答说:os.syst...
- Python常用文件操作库使用详解(python 对文件操作)
-
Python生态系统提供了丰富的文件操作库,可以处理各种复杂的文件操作需求。本教程将介绍Python中最常用的文件操作库及其实际应用。一、标准库核心模块1.1os模块-操作系统接口主要功能:文件...
- 你知道Python 如何进行高效的代码重构吗?
-
点赞、收藏、加关注,下次找我不迷路写出高质量的代码是每个程序员的追求。而代码重构作为提升代码质量的重要手段,却常常被新手忽视。很多新手在编写代码时,只关注功能是否实现,却不注重代码的结构和可维护性,...
- Python常用内置模块介绍——文件与系统操作详解
-
Python提供了多个强大的内置模块用于文件和系统操作,下面我将详细介绍最常用的几个模块及其核心功能。1.os模块-操作系统交互os模块提供了与操作系统交互的接口,包括文件/目录操作、进程管理、环...
- Python的tarfile模块解压缩.tar/.tar.gz等文件
-
python中的标准库tarfile模块可以帮助我们快速压缩或者解压后缀为.tar/.tar.gz/.tar.bz2/.tar.xz的文件。01、tarfile核心类与函数介绍使用方法因为tarfil...
- 批量重命名工具,Bulk Rename Utility软件体验
-
平常在电脑上处理电子文件,经常在得到文件本身时,没有空闲和精力去为文件重命名,像是一张图片,要作为下一个步骤的素材。而处理完事过后就不理它了,顺手直接丢回收站或者放在硬盘里。但是想把文件存档和提交给上...
- 照片怎样重命名?方法有四种(照片怎么可以重命名)
-
照片怎样重命名?照片在我们日常生活中扮演着越来越重要的角色,但是有时候,我们需要对照片进行重命名,以便更好地组织和查找它们,这样也可以大大提高我们的效率。在这篇文章中,我们将介绍四种简单的方法,让你轻...
- 你需要批量创建文件夹并命名吗,给你推荐几个方法
-
小李是一家设计公司的项目经理,最近接了一个大项目,需要整理大量的设计稿。每个设计稿都需要单独创建一个文件夹,以方便团队成员协作。手动创建文件夹效率太低,而且容易出错。小李在网上搜索了各种方法,尝试了P...
- 怎样批量重命名一个工作簿中的所有工作表
-
上篇文章,Python数据的选取和处理,阅读量93,收藏15,没有评论。目前正在复习Python+Excel实现办公自动化,有兴趣的可以一起讨论,共同提高。花了近4个小时终于把6个分部的统计工作表做好...
- Windows如何批量修改文件后缀名(电脑如何批量修改文件后缀名)
-
在Windows系统中药批量修改文件后缀名的方式非常多,每个方法的优缺点各有不同,下面通过几个常见的方式给大家介绍下,Windows如何批量修改文件后缀名的。给有需要的朋友几个参考。方法一:使用文件资...
- Python3+ 变量命名全攻略:PEP8 规范 + 官方禁忌 + 实战技巧,全搞懂!
-
Python3+变量命名规则与约定详解一、官方命名规则(必须遵守)1.合法字符集变量名只能包含:大小写字母(a-z,A-Z)数字(0-9)下划线(_)2.禁止数字开头合法:user_age,...
- python代码实现读取文件并生成韦恩图
-
00、背景今天战略解码,有同学用韦恩图展示各个产品线的占比,效果不错。韦恩图(Venndiagram),是在集合论数学分支中,在不太严格的意义下用以表示集合的一种图解。它们用于展示在不同的事物群组之...
- python学习第二天:用Pycharm新建的第一个程序
-
分享第一次使用Pycharm学到的内容第一次打开得到上面图片projects:项目customize:自定义plugins:插件learn:学习newproject新建项目聪明如我在插件那里找到了汉...
- 如何编写第一个Python程序(python第一个代码)
-
一、第一个python程序[掌握]python:python解释器,将python代码解释成计算机认识的语言pycharm:IDE(集成开发环境),写代码的一个软件,集成了写代码,...
- Python文件读写操作详解:从基础到实战
-
Python文件的读写操作在Python中,文件操作非常常见,可以通过内建的open()函数进行文件的读取、写入、创建等操作。理解文件操作的模式和with语句对于确保代码的简洁性和效率至...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python重命名文件 (54)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python人脸识别 (54)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)