python tarfile压缩包操作保姆级教程

目录
  • 前言
  • 1、tarfile
  • 2、处理 open 后的 TarFile 对象
  • 3、处理2中返回的 TarInfo 对象
  • 4、示例

前言

上次写博客还在去年的8月底了,期间有了小宝,换工作等诸多事宜让我踩坑采的起飞,时隔4个月,逐渐找回状态。这篇的主题是python的第三方库zipfile,因工作中要处理大量的压缩包zip文件,所以趁着自由时间整理输出下,以提高下工作的愉悦感。

1、tarfile

这个工具可以帮我们解决 zip 压缩包的创建、读取、写入、添加、列出内部所有的成员。更高效的处理压缩包,已达到快速处理数据的目的。

入口1:tarfile.open(name=“sample.zip”)

tar = tarfile.open(name="sample.zip"),针对路径名 name 返回 TarFile 对象。这个对象可以用来解压所有、解压出其中符合规则的文件、添加、写入等。

import tarfile
tar = tarfile.open("sample.zip") # or tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()

入口2:tarfile.is_tarfile(name)

tarfile.is_tarfile(name),判断文件是不是tar包,name为文件的路径

import tarfile
if tarfile.is_tarfile("./tartest/tar_1.tar"):
    print(1)

2、处理 open 后的 TarFile 对象

TarFile 对象可在 with 语句中作为上下文管理器使用。 当语句块结束时它将自动被关闭。tarfile对象主要用来:

  • 生成归档的成员name
  • 生成归档的成员 tarnifo 对象
  • 判断某文件在不在归档中
  • 将归档成员的相信信息打到界面上
  • 解压整个tar包到指定目录
  • 解压tar包的某个文件到指定目录
  • 将归档中的一个成员提取为文件tarinfo对象
  • 将指定目录下的 jiao.txt 压缩到指定目录下的 tar 包,tar不存在则新建一个,存在,则替换里面的内容
import tarfile
# if tarfile.is_tarfile("./tartest/tar_1.tar"):
#     print(1)
tar = tarfile.open("./tartest/tar_1.tar")
print("以 tarinfo 返回归档的成员:", tar.getmembers())
# 以 tarinfo 返回归档的成员: [<TarInfo 'tar_1' at 0x1a74e3c57c0>, <TarInfo 'tar_1/jiao.txt' at 0x1a74e3c5e80>]
print("以 名称 返回归档的成员:", tar.getnames())
# 以 名称 返回归档的成员: ['tar_1', 'tar_1/jiao.txt']
print("如果name在归档中找到,则返回True", tar.getmember(name = "tar_1/jiao.txt"))
# 如果name在归档中找到,则返回True <TarInfo 'tar_1/jiao.txt' at 0x1a74e3c5e80>
if tar.getmember(name="tar_1/jiao.txt"):
    print("找到了")
print("【将内容清单打印到 sys.stdout】", tar.list())
"""
?rwxrwxrwx 0/0          0 2023-02-03 23:37:40 tar_1/
?rwxrwxrwx 0/0         15 2023-02-03 23:37:56 tar_1/jiao.txt
"""
tar.extractall(path="./new_tar_file/")
# 当前目录下生成目录 new_tar_file
tar.extract(member="tar_1/jiao.txt", path="./new_tar_file1/")
# 从归档中提取出一个成员放入指定目录,默认当前目录。大多数情况下使用 extractall()
print("【将归档中的一个成员提取为文件对象】", tar.extractfile(member="tar_1/jiao.txt"))
# 【将归档中的一个成员提取为文件对象】 <ExFileObject name='./tartest/tar_1.tar'>
# 将当前目录下的 jiao.txt 压缩到指定目录下的 tar 包,tar不存在则新建一个,存在,则替换里面的内容
tar1 = tarfile.open(name="./tartest/tar_3.tar", mode="w|")
tar1.add(name="./jiao.txt")
tar1.close()  # 关闭 tarfile 对象
# 暂不清楚的
"""
tar.addfile() 将 TarInfo 对象 tarinfo 添加到归档
tar.gettarinfo()  基于 os.stat() 的结果或者现有文件的相同数据创建一个 TarInfo
"""

3、处理2中返回的 TarInfo 对象

TarInfo 对象代表 TarFile 中的一个文件,除了会存储所有必要的文件属性(例如文件类型、大小、时间、权限、所有者等),它还提供了一些确定文件类型的有用方法。 此对象 并不 包含文件数据本身(意思你拿不到txt文本里面的数据)。

import tarfile
tar = tarfile.open("./tartest/tar_1.tar")
tarinfos = tar.getmembers()
for tarinfo in tarinfos:
    print("基于 TarInfo 对象创建一个字符串缓冲区", i.tobuf())
    print(tarinfo.name, "tar包成员的名称")
    print(tarinfo.size, "tar包成员的大小")
    print(tarinfo.mtime, "上次修改的时间")
    print(tarinfo.mode, "权限位")
    print(tarinfo.type, "文件类型")
    print(tarinfo.linkname, "目标文件名的名称,该属性仅在类型为 LNKTYPE 和 SYMTYPE 的 TarInfo 对象中存在")
    print(tarinfo.uid, tarinfo.gid, tarinfo.uname, tarinfo.gname)
    if tarinfo.isfile():
        print("如果 Tarinfo 对象为普通文件则返回 True")
    if tarinfo.isdir():
        print("如果为目录则返回 True")
    if tarinfo.issym():
        print("如果为符号链接则返回 True")
    if tarinfo.islnk():
        print("如果为硬链接则返回 True")
    # 还有其他不常用的,不深入研究了

4、示例

如何将整个 tar 归档提取到当前工作目

import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()

如何通过 TarFile.extractall() 使用生成器函数而非列表来提取一个 tar包成员的子集

import os
import tarfile
def py_files(members):
    for tarinfo in members:
    	# os.path.splitext(路径) 用来分离文件名与拓展名
        if os.path.splitext(tarinfo.name)[1] == ".sql":
            yield tarinfo
tar = tarfile.open("sample.tar.gz")
tar.extractall(members=py_files(tar))
tar.close()

将一堆文件压缩成tar包:

import tarfile
tar = tarfile.open("sample.tar", "w")
for name in ["foo.txt", "bar.txt", "quux.txt"]:
    tar.add(name)
tar.close()

使用 with 语句将一堆文件压缩成tar包

import tarfile
with tarfile.open("sample.tar", "w") as tar:
    for name in ["foo", "bar", "quux"]:
        tar.add(name)

读取一个 gzip 压缩的 tar 包并显示一些成员信息

import tarfile
tar = tarfile.open("sample.tar.gz", "r:gz")
for tarinfo in tar:
    print(tarinfo.name, "is", tarinfo.size, "bytes in size and is ", end="")
    if tarinfo.isreg():
        print("a regular file.")
    elif tarinfo.isdir():
        print("a directory.")
    else:
        print("something else.")
tar.close()

创建一个归档并使用 TarFile.add() 中的 filter 形参来重置用户信息

import tarfile
def reset(tarinfo):
    tarinfo.uid = tarinfo.gid = 0
    tarinfo.uname = tarinfo.gname = "root"
    return tarinfo
tar = tarfile.open("sample.tar.gz", "w:gz")
tar.add("foo", filter=reset)
tar.close()

到此这篇关于python tarfile压缩包操作保姆级教程的文章就介绍到这了,更多相关python tarfile内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python标准库压缩包模块zipfile和tarfile详解(常用标准库)

    目录 常用的标准库 zip格式 ZipFile参数说明 操作含义 压缩方法 常用方法 tar包 和 gz.bz2.xz格式 删除压缩包中的文件 常用的标准库 在我们常用的系统windows和Linux系统中有很多支持的压缩包格式,包括但不限于以下种类:rar.zip.tar,以下的标准库的作用就是用于压缩解压缩其中一些格式的压缩包. zip格式 import zipfile zipfile模块操作压缩包使用ZipFile类进行操作,使用方法和open的使用方法很相似,也是使用r.w.x.a四种操

  • Python中使用tarfile压缩、解压tar归档文件示例

    Python自带的tarfile模块可以方便读取tar归档文件,牛b的是可以处理使用gzip和bz2压缩归档文件tar.gz和tar.bz2. 与tarfile对应的是zipfile模块,zipfile是处理zip压缩的.请注意:os.system(cmd)可以使Python脚本执行命令,当然包括:tar -czf  *.tar.gz *,tar -xzf *.tar.gz,unzip等,当我觉得这样尽管可以解决问题,但我觉得很业余. 使用tarfile压缩 复制代码 代码如下: import

  • Python标准库之zipfile和tarfile模块的使用

    目录 zip格式 ZipFile参数说明 操作含义 压缩方法 常用方法 tar包 和 gz.bz2.xz格式 操作tar包 压缩 解压缩 删除压缩包中的文件 在我们常用的系统windows和Linux系统中有很多支持的压缩包格式,包括但不限于以下种类:rar.zip.tar,以下的标准库的作用就是用于压缩解压缩其中一些格式的压缩包. zip格式 import zipfile zipfile模块操作压缩包使用ZipFile类进行操作,使用方法和open的使用方法很相似,也是使用r.w.x.a四种操

  • python tarfile压缩包操作保姆级教程

    目录 前言 1.tarfile 2.处理 open 后的 TarFile 对象 3.处理2中返回的 TarInfo 对象 4.示例 前言 上次写博客还在去年的8月底了,期间有了小宝,换工作等诸多事宜让我踩坑采的起飞,时隔4个月,逐渐找回状态.这篇的主题是python的第三方库zipfile,因工作中要处理大量的压缩包zip文件,所以趁着自由时间整理输出下,以提高下工作的愉悦感. 1.tarfile 这个工具可以帮我们解决 zip 压缩包的创建.读取.写入.添加.列出内部所有的成员.更高效的处理压

  • 用Python简单实现个贪吃蛇小游戏(保姆级教程)

    一.前言 本期介绍 Python 练手级项目--贪吃蛇! 原本想推荐一个贪吃蛇的开源项目:python-console-snake,但由于该项目最近一次更新是 8 年前,而且在运行的时候出现了诸多问题.索性我就动手用 Python 重新写了一个贪吃蛇游戏. 下面我们就一起用 Python 实现一个简单有趣的命令行贪吃蛇小游戏,启动命令: git clone https://github.com/AnthonySun256/easy_games cd easy_games python snake

  • C语言文件操作零基础新手入门保姆级教程

    目录 一.前言 二.文件操作基础知识 ①什么是文件 ②数据文件类型 ③数据如何存储 ④如何读取二进制文件 ⑤什么是文件名 ⑥文件缓冲区 ⑦文件指针 三.文件操作函数 ①fopen 与 fclose ②fputc与fgetc ③fputs与fgets ④fprintf与fscanf ⑤fwrite与fread ⑥fseek与ftell与rewind ⑦ferror与feof ⑧补充函数 sscanf sprintf ⑨补充函数perror  strerror 总结 一.前言 我们如何使我们设计的程

  • xmind免费安装使用保姆级教程详解

    目录 xmind免费安装使用保姆级教程 一.简介 二.安装 Xmind 1.开始安装 2.安装免费补丁 3.打开xmind 三.Xmind的基本功能 1.创建新思维导图 2.添加节点 3.编辑节点内容 4.设置节点属性 5.添加关联和标签 6.快速分支 7.框选 8.快捷键 9.分享和协作 10.导出和导入 11.云端存储和同步 12.模板库和资源库 四.总结 推荐阅读:XMind 2021激活码及安装步骤 xmind免费安装使用保姆级教程 一.简介 xmind 是一款功能强大的思维导图和脑图制

  • Android 创建依赖库的方法(保姆级教程)

    新建工程,新建Module 新建一个工程,之后按下图中的操作方式,创建一个 Module 创建 Android Library 选中 Android Library,之后点击Next! 输入你要创建module名字 输入你要创建module名字,如果有,但请不要删除前面的两个冒号(可能会因AndroidStudio版本原因显示界面不一样)!之后点击Finish! 在Module中新建测试类 如图,找到以下文件目录,在Module中新建测试类 上传github 之后要上传Github,导入JitP

  • Kettle下载与安装保姆级教程(最新)

    目录 Kettle简介 主要功能 运行环境 Kettle下载 下载地址: 运行Kettle 导入数据库驱动jar包 Kettle使用 配置资源库与数据库 修改.添加用户信息 总结 Kettle简介 Kettle最早是一个开源的ETL(Extract-Transform-Load的缩写)工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment.后来Kettle重命名为Pentaho Data Integ

  • 详解Mybatis-plus(MP)中CRUD操作保姆级笔记

    目录 一.什么是mybatis-plus 1.在java中访问数据库 2.Mybatis-plus简介 3.Mybatis-plus特性 二.第一个mybatis-plus开发 1.使用MP的步骤: 前提:数据库/表创建 2.mybatis-plus日志 三.MP操作CRUD 的 基本用法 1.添加数据后,获取主键值(MP可以自动实现主键回填) 2.更新数据 3.删除数据 4.查询数据 5.mybatis-plus中CRUD的底层实现原理 一.什么是mybatis-plus 1.在java中访问

  • 教你在VMware中安装Windows11操作系统的保姆级教程

    目录 1.Windows11操作系统简介 2.在VMware中创建一个新的虚拟机 2.1.下载Windows 11系统镜像 2.2.新建一个windows虚拟机 2.3.配置虚拟机资源设置 2.4.将虚拟机开机选择blos启动 3.安装Windows11操作系统 3.1.安装操作系统 3.2.设置系统 4.Windows11安装完成administrator 1.Windows11操作系统简介 Windows 11是由微软公司(Microsoft)开发的操作系统,应用于计算机和平板电脑等设备 [

  • 青龙面板拉库解决没有或丢失依赖can‘t find module的保姆级教程(附青龙面板脚本仓库)

    目录 1.青龙面板拉库 2.分享收集的青龙面板脚本仓库,建议选择拉一个就可以了 3.安装脚本所需要的依赖库 4.设置环境变量 5.拉取单个文件,依赖修复方法 如何拉库: 拉取单个脚本 使用方法: 拉库出现的问题及解决方案 解决办法: 方法1)复制对应缺失的<module名称>.js或.py到库文件夹 方法2)完善ql repo命令的依赖部分,重新运行拉库命令: 6.结尾 没有安装青龙面板的先看我另外一篇教程2022年青龙面板部署完整版教程(多图) 1.青龙面板拉库 先把配置文件config.s

  • 最新青龙面板2.10.2搭建+XDD-PLUS的保姆级教程

    目录 11月26日更新内容: 11月20日更新内容: 准备工作 安装青龙面板 安装go环境 安装XDD-Plus xdd-plus大佬更新了1.8版本已经更新了最新版的机器人了 更新方法: 整个xdd-plus目录删掉 然后按照教程重新安装一次 在启动之前先去qbot文件夹里面修改下config文件里面的QQ改成你机器人的QQ即可其他不用动 改完以后就./xdd扫码登录,挂后台完事 注:博主没有在用xdd了,xdd的配置文件记得在冒号有变留一个空格 如果有文字注释就在#号前面留一个空格. 11月

随机推荐