脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - python tarfile压缩包操作保姆级教程

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

2023-06-05 14:17阿_焦 Python

TarFile类就是tar压缩包,其由member块组成, member块则包括header块和data块. 每个member以TarInfo对象形式描述. 所以TarFile就是TarInfo的序列

前言

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

1、tarfile

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

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

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

?
1
2
3
4
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为文件的路径

?
1
2
3
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不存在则新建一个,存在,则替换里面的内容
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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文本里面的数据)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 归档提取到当前工作目

?
1
2
3
4
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()

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

?
1
2
3
4
5
6
7
8
9
10
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包:

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
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 形参来重置用户信息

?
1
2
3
4
5
6
7
8
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内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_45451320/article/details/128877371

延伸 · 阅读

精彩推荐
  • PythonPython实现的用户登录系统功能示例

    Python实现的用户登录系统功能示例

    这篇文章主要介绍了Python实现的用户登录系统功能,涉及Python流程控制及字符串判断等相关操作技巧,需要的朋友可以参考下...

    毕加索的ma12682021-01-12
  • PythonPython控制自己的手机摄像头拍照并自动发送到邮箱案例讲解

    Python控制自己的手机摄像头拍照并自动发送到邮箱案例讲解

    这篇文章主要介绍了Python控制自己的手机摄像头拍照,并把照片自动发送到邮箱,大概思路是通过opencv调用摄像头拍照保存图像本地用email库构造邮件内容...

    松鼠爱吃饼干11472022-11-30
  • Pythonpython装饰器代码深入讲解

    python装饰器代码深入讲解

    这篇文章主要介绍了python装饰器代码深入讲解,文章使用代码讲解了pythone装饰器的用法,有感兴趣的同学可以学习下...

    newname8002021-09-12
  • PythonPython时间序列数据的预处理方法总结

    Python时间序列数据的预处理方法总结

    这篇文章主要介绍了Python时间序列数据的预处理方法总结,时间序列数据随处可见,要进行时间序列分析,我们必须先对数据进行预处理。时间序列预处理...

    我爱Python数据挖掘5272022-07-28
  • Pythonpython操作redis的方法

    python操作redis的方法

    这篇文章主要介绍了python操作redis的方法,包括Python针对redis的连接、设置、获取、删除等常用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    tpythoner5232020-07-20
  • Python基于asyncio 异步协程框架实现收集B站直播弹幕

    基于asyncio 异步协程框架实现收集B站直播弹幕

    本文给大家分享的是基于asyncio 异步协程框架实现收集B站直播弹幕收集系统的简单设计,并附上源码,有需要的小伙伴可以参考下...

    liyiyang3082020-09-06
  • Python秒懂!图解四个实用的Pandas函数!

    秒懂!图解四个实用的Pandas函数!

    在用Python进行机器学习或者日常的数据处理中,Pandas是最常用的Python库之一,熟练掌握pandas是每一个数据科学家的必备技能,本文将用代码+图片详解Panda...

    早起Python4772020-10-30
  • PythonPython 互换字典的键值对实例

    Python 互换字典的键值对实例

    今天小编就为大家分享一篇Python 互换字典的键值对实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    喜欢海呀8252021-05-27