Skip to content

tarfile

tarfile模块提供了用于读写 tar 归档的能力,并且支持使用 gzip、bz2 和 lzma 压缩的归档。

tarfile.open()

该方法是处理 tar 归档的入口,他返回一个 TarFile 对象:

Python
tarfile.open(
  name:str,        # 文件路径
  mode='r',        # 打开模式
) -> TarFile

这其中的核心就是 mode,他表示打开模式:

模式 说明
"r" 读取 tar,自动检测是否压缩
"r:" 读取没有压缩的 tar
"r:gz/bz2/xz" 读取使用指定压缩的 tar
"x" 新建一个不带压缩的 tar,如果文件存在抛出异常
"x:gz/bz2/xz" 新建一个指定压缩的 tar,如果文件存在抛出异常
"a" 向一个 tar 文件中追加数据
"w" 创建或截断一个不带压缩的 tar 来写入
"w:gz/bz2/xz" 创建或截断一个带指定压缩的 tar 来写入

需要注意 tar 的压缩机制是在完全打包后在进行压缩,因此 "a:gz/bz2/xz" 这样的组合是不存在的。并且又是这种机制 tar 实际上是可以和各种压缩工具结合使用的,尽管最常见的是上面三个,如果打开了不受支持的 tar 则会引发 CompressionError 。

Tips

由于 tar 后缀并不是必须的,通常由魔术字符串来判断 tar,tarfile 提供了一个 tarfile.is_tarfile(name) 方法来判断文件是否为 tar

流式压缩

同样由于这种压缩机制,要想读取 tarfile 就需要将所有的数据解压缩后放入内存然后才能够接包数据,或者必须完全构造 tar 包后才能够压缩。这对于小文件还好说,对于大文件就必须提供一种流式接口。因此 还提供了几个特殊的模式:

模式 说明
"r\|*" 以流的形式读取 tar (自动检测压缩)块
"r\|" 以流的形式读取未压缩的 tar 块
"r\|gz/bz2/xz" 以流的形式打开指定压缩的 tar 块
"w\|" 以流的形式写入一个未压缩的 tar
"w\|gz/bz2/xz" 以流的形式写入一个指定压缩的 tar

在流模式下有一个限制就是只能顺序读取其中的内容,而不能随机读取

TarFile

该对象表示一个 tar 归档文件,它实际上是归档成员的序列,在 tarfile 中使用来表示归档成员。

Note

通常我们不应该直接构造 TarFile 对象,而是通过 tarfile.open() 返回,他实际上是 Tarfile.open() 类方法的快捷方式

该对象包含众多方法,他们是我们操作 tar 归档文件的主要方式:

方法 说明
getmembers() 以列表返回 tar 归档的所有成员
getnames() 以 name 字符串列表返回 tar 归档的所有成员
getmember(name) 返回成员 name 的 对象,如果不存在抛出 KeyError(流模式下无法使用)
next() 返回归档的下一个成员的 ,当我们以流打开时这是主要的读取方式
extractall(path='.', members=None) 将归档的所有成员提取到当前工作目录或指定的 path 目录,可以指定 members 来指定要提取的文件
extract(member,path='.') 提取指定成员,member 可是 name 或者 TarInfo, 默认到当前目录,可以指定其他 path
extractfile(member) 提取指定成员为文件对象(io.BufferedReader)
add(name) 添加 name 到归档,name 是要添加的文件的路径
addfile(tarinfo) 将 TarInfo 添加到归档
close() 关闭 TarFile,通常使用 with,他会向归档添加结束数据块并关闭句柄

TarInfo

该对象表示 TarFile 中的一个归档文件,他包含描述文件属性的文件类型、大小、时间、权限、所有者等信息,还提供了一些方法来归档文件。注意此对象并不包含数据本身