当前位置: 首页 > 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聊天机器人编辑界面后选择“主题”-“新建主题”。 在“新建主题”中添加“触…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...