当前位置: 首页 > news >正文

tarfile — 访问 Tar 压缩文件

tarfile — 访问 Tar 压缩文件

1.概述

tarfile 模块提供对 Unix tar 存档的读写访问,包括压缩文件。除了 POSIX 标准之外,还支持几种 GNU tar 扩展。还提供处理 Unix 特殊文件类型,如硬链接和软链接,以及设备节点.
虽然 tarfile 实现了 Unix 格式,但它也可用于在 Microsoft Windows 下创建和读取 tar 存档

2.测试 Tar 文件

is_tarfile() 函数返回一个布尔值,指示作为参数传递的文件名是否指向有效的 tar 存档。

import tarfilefor filename in ['README.txt', 'example.tar','bad_example.tar', 'notthere.tar']:try:print('{:>15}  {}'.format(filename, tarfile.is_tarfile(filename)))except IOError as err:print('{:>15}  {}'.format(filename, err))

如果文件不存在,is_tarfile() 会引发一个 IOError

python3 tarfile_is_tarfile.pyREADME.txt  Falseexample.tar  True
bad_example.tar  Falsenotthere.tar  [Errno 2] No such file or directory:
'notthere.tar'

3.tar文件中读取元数据

直接使用 TarFile 类来操作一个 tar 压缩文件。这个类不仅可用来读取数据,而且可用来添加文件到压缩文件中。

3.1.查看tar包中所有文件名称

使用 getnames() 来读取压缩文件中所有文件的文件名。

import tarfilewith tarfile.open('example.tar', 'r') as t:print(t.getnames())

该函数的返回一个字符串列表,包含了所有所含文件的文件名

['index.rst', 'README.txt']

3.2.获取元信息

除了文件名,其他元数据信息可以通过使用 TarInfo 类的实例来获取.

import tarfile
import timewith tarfile.open('example.tar', 'r') as t:for member_info in t.getmembers():print(member_info.name)print('  Modified:', time.ctime(member_info.mtime))print('  Mode    :', oct(member_info.mode))print('  Type    :', member_info.type)print('  Size    :', member_info.size, 'bytes')print()

通过 getmembers() 和 getmember() 函数来获取元数据。

index.rstModified: Fri Aug 19 16:27:54 2016Mode    : 0o644Type    : b'0'Size    : 9878 bytesREADME.txtModified: Fri Aug 19 16:27:54 2016Mode    : 0o644Type    : b'0'Size    : 75 bytes

如果一个所含文件的文件名已知,可使用 getmember() 函数获取其所对应的 TarInfo 对象

import tarfile
import timewith tarfile.open('example.tar', 'r') as t:for filename in ['README.txt', 'notthere.txt']:try:info = t.getmember(filename)except KeyError:print('ERROR: Did not find {} in tar archive'.format(filename))else:print('{} is {:d} bytes'.format(info.name, info.size))

如果文件名所对应的文件不存在压缩文件中,函数 getmember() 会抛出一个 KeyError 异常

README.txt is 75 bytes
ERROR: Did not find notthere.txt in tar archive

4.解压文件

4.1.读取压缩文件内容

如果需要在程序中的访问某个压缩包中文件的数据,可使用 extractfile() 方法,并把压缩包里面文件名称作为参数传入。

import tarfilewith tarfile.open('example.tar', 'r') as t:# 查看内容的文件列表for filename in ['README.txt', 'notthere.txt']:try:# 返回类型是一个文件,可调用操作文件方法读取内容f = t.extractfile(filename)except KeyError:print('ERROR: Did not find {} in tar archive'.format(filename))else:print(filename, ':')# 查看文件内容print(f.read().decode('utf-8'))

返回值是一个类似文件的对象,从该对象中可以读取归档成员的内容

README.txt :
The examples for the tarfile module use this file and
example.tar as data.ERROR: Did not find notthere.txt in tar archive

4.2.压缩包解压成文件

若想对归档行解包操作,并将文件写入文件系统内,可以使用 extract()extractall() 取代之前的方法。

1.解压指定文件

import tarfile
import osos.mkdir('outdir')
with tarfile.open('example.tar', 'r') as t:# 指定解压的文件和存储路径t.extract('README.txt', 'outdir')
print(os.listdir('outdir'))

归档中的成员被从归档中读取并写入文件系统,extract函数中outdir指定解压的路径。

2.解压所有文件

标准库文档中有一个注释提到 extractall() 方法的安全性强于 extract() ,尤其是在处理不能回滚读取较早时间输入部分的流式数据的情况下,所以前者应当更广泛地应用。
extractall() 的第一个参数是文件被写入路径的名称

import tarfile
import osos.mkdir('outdir')
with tarfile.open('example.tar', 'r') as t:t.extractall('outdir')
print(os.listdir('outdir'))

若需从归档中提取特定的文件,可将需提取的文件名或者 TarInfo 元数据容器作为参数传递给 extractall()

import tarfile
import osos.mkdir('outdir')
with tarfile.open('example.tar', 'r') as t:t.extractall('outdir',members=[t.getmember('README.txt')],)
print(os.listdir('outdir'))

5.创建压缩包

5.1.创建压缩包

使用带’w’ 模式的 TarFile 来创建一个新的归档文件

import tarfileprint('creating archive')
with tarfile.open('tarfile_add.tar', mode='w') as out:print('adding README.txt')out.add('README.txt')print()
print('Contents:')
with tarfile.open('tarfile_add.tar', mode='r') as t:for member_info in t.getmembers():print(member_info.name)

已有的文件会被清除,同时创立一个新的归档文件。使用 add() 函数来添加新成员到新建的归档文件中

creating archive
adding README.txtContents:
README.txt

5.2.重命名文件添加到压缩包

在创建压缩包时,向压缩包添加文件时可以修改文件名称在将文件添加到压缩包。这个可通过构造一个带有 arcname 的 TarInfo 对象,并将其传入 addfile() 函数来实现。

import tarfileprint('creating archive')
with tarfile.open('tarfile_addfile.tar', mode='w') as out:print('adding README.txt as RENAMED.txt')# 重命名文件名称info = out.gettarinfo('README.txt', arcname='RENAMED.txt')out.addfile(info)print()
print('Contents:')
with tarfile.open('tarfile_addfile.tar', mode='r') as t:for member_info in t.getmembers():print(member_info.name)

该归档只含有一个重命名的文件:

creating archive
adding README.txt as RENAMED.txtContents:
RENAMED.txt

5.3.内存数据添加到压缩包

有时候,我们需要直接从内存中将数据写进压缩包,而不是先将数据写入文件,再将文件添加进压缩包。你可以使用 addfile() 来从类似于打开文件的句柄添加数据来返回字节

import io
import tarfiletext = 'This is the data to write to the archive.'
data = text.encode('utf-8')with tarfile.open('addfile_string.tar', mode='w') as out:# 构建一个文件info = tarfile.TarInfo('made_up_file.txt')info.size = len(data)# 将内存中的数据添加到文件,并打包out.addfile(info, io.BytesIO(data))print('Contents:')
with tarfile.open('addfile_string.tar', mode='r') as t:for member_info in t.getmembers():print(member_info.name)f = t.extractfile(member_info)print(f.read().decode('utf-8'))

通过首先构造 TarInfo 对象, 可以为压缩包成员指定你想要的任意名称。在设置了其大小之后,使用 addfile() 和 BytesIO 缓冲区作为数据源将数据写进压缩包中。

Contents:
made_up_file.txt
This is the data to write to the archive.

5.4.压缩包追加文件

除了创建新的归档文件,还可以通过设置模式参数为’a’ 来添加新文件到已有的归档文件

import tarfileprint('creating archive')
with tarfile.open('tarfile_append.tar', mode='w') as out:out.add('README.txt')print('contents:',)
with tarfile.open('tarfile_append.tar', mode='r') as t:print([m.name for m in t.getmembers()])print('adding index.rst')
with tarfile.open('tarfile_append.tar', mode='a') as out:out.add('index.rst')print('contents:',)
with tarfile.open('tarfile_append.tar', mode='r') as t:print([m.name for m in t.getmembers()])

最终的归档文件包含了两个成员:

creating archive
contents:
['README.txt']
adding index.rst
contents:
['README.txt', 'index.rst']

6.处理其他格式压缩文件

除了正常的 Tar 归档文件,tarfile 模块还可处理通过 gzip 或 bzip2 协议压缩的归档文件。要打开一个压缩的归档文件,根据不同的压缩协议,传入 “:gz” 或 “:bz2” 模式参数到 open() 函数。

import tarfile
import osfmt = '{:<30} {:<10}'
print(fmt.format('FILENAME', 'SIZE'))
print(fmt.format('README.txt', os.stat('README.txt').st_size))FILES = [('tarfile_compression.tar', 'w'),('tarfile_compression.tar.gz', 'w:gz'),('tarfile_compression.tar.bz2', 'w:bz2'),
]for filename, write_mode in FILES:with tarfile.open(filename, mode=write_mode) as out:out.add('README.txt')print(fmt.format(filename, os.stat(filename).st_size),end=' ')print([m.namefor m in tarfile.open(filename, 'r:*').getmembers()])

如果使用 “r:*” 模式读取一个归档文件时,tarfile 会自动识别压缩方法。

FILENAME                       SIZE
README.txt                     75
tarfile_compression.tar        10240      ['README.txt']
tarfile_compression.tar.gz     213        ['README.txt']
tarfile_compression.tar.bz2    199        ['README.txt']

相关文章:

tarfile — 访问 Tar 压缩文件

tarfile — 访问 Tar 压缩文件 1.概述 tarfile 模块提供对 Unix tar 存档的读写访问&#xff0c;包括压缩文件。除了 POSIX 标准之外&#xff0c;还支持几种 GNU tar 扩展。还提供处理 Unix 特殊文件类型&#xff0c;如硬链接和软链接&#xff0c;以及设备节点. 虽然 tarfile…...

C++14深度探索之C++基础-共享指针与弱指针使用

shared_ptr : 共享指针 管理多个客户使用的内存,多客户都拥有该内存块, 当共享指针不再拥有该内存时,内存会自动释放, 多用于并发领域,当所有访问该内存的线程都退出时,释放该内存 共享指针可被随意复制,与独占指针相反,独占指针不能被复制 在内存与时间上有一定的开销…...

【React全家桶】reac组件通信

&#x1f39e;️&#x1f39e;️&#x1f39e;️ 博主主页&#xff1a; 糖 &#xff0d;O&#xff0d; &#x1f449;&#x1f449;&#x1f449; react专栏&#xff1a;react全家桶 &#x1f339;&#x1f339;&#x1f339;希望各位博主多多支持&#xff01;&#xff01;&a…...

2023,再转行去做软件测试还有前途吗?

近年来&#xff0c;以云计算、移动互联网、物联网、工业互联网、人工智能、大数据及区块链等新一代信息技术构建的智能化应用和产品出现爆发式增长&#xff0c;突破了传统对于软件形态的认知&#xff0c;软件形态正以各种展现方式诠释着对新型智能软件的定义。这也使得软件的质…...

Java程序API数据接口

API&#xff1a;应用程序接口&#xff08;API&#xff1a;Application Program Interface&#xff09; 一、使用数据接口的作用 1、封装逻辑 数据接口从数据库查询出数据&#xff0c;并组织成json格式&#xff0c;这个逻辑如果在每个终端都写一遍&#xff0c;那样将编写大量…...

剑指offer 7 数组中和为0的三个数

此问题属于nsum问题&#xff0c;题目链接&#xff1a;力扣 要求在数组中找到不重复的三元组&#xff0c;三个数加起来为0&#xff0c;且每个下标只能用一次。而且需要返回所有这样的不重复数组。 1. 排序 双指针 1. 「不重复」的本质是什么&#xff1f;我们保持三重循环的大…...

DockerFile

大家想想&#xff0c;Nginx&#xff0c;tomcat&#xff0c;mysql 这些镜像都是哪里来的&#xff1f;官方能写&#xff0c;我们不能写吗&#xff1f; 我们要研究自己如何做一个镜像&#xff0c;而且我们写的微服务项目以及springboot打包上云部署&#xff0c;Docker就是最方便的…...

Vue-Router 介绍及路由原理分析

文章目录Vue-Router 路由模式单页面与传统页面跳转的区别Hash 模式History 模式abstract 模式原理解析Hash 模式原理History 模式原理路由使用引入 Vue-Router获取全局路由跳转参数的变化获取路由中带的参数重定向页面Vue-Router 路由模式 单页面与传统页面跳转的区别 单页面…...

git代码提交后jenkins构建和自动部署

利用jenkins和gitlab的webhook结合&#xff0c;实现提交代码之后&#xff0c;自动触发jenkins的构建。顺带介绍一下通过触发器构建&#xff0c;比如直接通过url去触发的方式。 一、jenkins结合webhook 1、jenkins配置 a、首先jenkins得需要安装两个gitlab的插件&#xff1a;(…...

2023面试题目总结

项目遇到的问题难点&#xff1f; 老项目版本过低(angular4),相关框架太少&#xff0c;需要升级成新框架。 1.single-spa 2.qiankun 3.iframe 样式环境隔离/js隔离/公共依赖的加载 JS 原型&#xff0c;原型链&#xff0c;new 原型是存放公共属性地方&#xff0c;所有实例都…...

Vue常用指令及声明周期

文章目录知识点前端开发环境配置v-text && v-htmlv-if、v-else && v-showv-forv-onv-modelv-bind、v-cloak、v-pre&&v-once全局 API 是什么Vue.directive 自定义组件Vue.directive 是什么自定义组件回调函数参数自定义组件的生命周期Vue.set 全局操作为…...

MariaDB 成功敲钟上市 | 它与 Navciat 缘起 10 年前

MariaDB 敲钟上市2022 年底&#xff0c;云数据库公司 MariaDB 与 Angel Pond Holdings 公司完成合并&#xff0c;并在纽交所上市。新公司更名为 MariaDB&#xff0c;MySQL 之父奋斗了13年终敲钟。这标志着 MariaDB 开启新篇章。无论从开源还是商业之路&#xff0c;都将成为业内…...

LESS模型与随机森林

模型学习 1 随机森林 https://blog.csdn.net/weixin_35770067/article/details/107346591? 森林就是建立了很多决策树&#xff0c;把很多决策树组合到一起就是森林。 这些决策树都是为了解决同一任务建立的&#xff0c;最终的目标也都是一致的&#xff0c;最后将其结果来平均…...

如何利用Power Virtual Agents机器人实现成绩查询服务

今天我们继续介绍如何利用Power Virtual Agents来实现成绩查询服务。设计思路是在PVA聊天机器人的对话框中输入学生的姓名和学号来进行成绩的查询。首先&#xff0c;在Microsoft 365的OneDrive中制作一个Excel格式的成绩单。 可以将学生的学号、姓名、各学科成绩进行添加。 在P…...

flavor 配置

文章目录1. flavorDimensions1.1 单维度1.2 多维度2. BuildConfig3. sourceSets4. 参考资料1. flavorDimensions 与 productFlavors 配合使用使用 flavorDimensions 定义风味维度&#xff0c;维度越多&#xff0c;能打出的渠道包越丰富 1.1 单维度 defaultConfig {...flavor…...

《第一行代码》 第五章:详解广播机制

如果你了解网络通信原理应该会知道&#xff0c;在一个 IP 网络范围中最大的IP 地址是被保留作为广播地址来使用的。比如某个网络的 IP 范围是 192.168.0XXX&#xff0c;子网掩码是255.255.255.0那么这个网络的广播地址就是 192.168.0255广播数据包会被发送到同-网络上的所有端口…...

Leetcode(每日一题)——1139. 最大的以 1 为边界的正方形

摘要 1139. 最大的以 1 为边界的正方形 一、以1为边界的最大正方形 1.1 动态规划 第530题需要正方形所有网格中的数字都是1&#xff0c;只要搞懂动态规划的原理&#xff0c;代码就非常简洁。而这题只要正方形4条边的网格都是1即可&#xff0c;中间是什么数字不用管。 这题…...

YOLOv5:GitHub两万八Star项目

来源&#xff1a;投稿 作者&#xff1a;王同学 编辑&#xff1a;学姐 Yolov5详解 官方源码仓库&#xff1a;https://github.com/ultralytics/yolov5 相关论文&#xff1a;未发表&#xff08;改进点都被你们抢先发了&#xff09; 0 前言 截止到2022年7月&#xff0c;Yolov5项…...

袋鼠云产品功能更新报告04期丨2023年首次,产品升级“狂飙”

新的一年我们加紧了更新迭代的速度&#xff0c;增加了数据湖平台EasyLake和大数据基础平台EasyMR&#xff0c;超40项功能升级优化。我们将继续保持产品升级节奏&#xff0c;满足不同行业用户的更多需求&#xff0c;为用户带来极致的产品使用体验。 以下为袋鼠云产品功能更新报…...

如何在Power Virtual Agents中使用Power Automate

今天我们来介绍一下如何在Power Virtual Agents中使用PowerAutomate。我们以通过在PVA聊天机器人的对话框中输入“发布通知”后会把预设好的通知信息自动发布到Teams中的某个团队中为例。首先进入PVA聊天机器人编辑界面后选择“主题”-“新建主题”。 在“新建主题”中添加“触…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...