tarfile
tarfile模块提供了用于读写 tar 归档的能力,并且支持使用 gzip、bz2 和 lzma 压缩的归档。
tarfile.open()
该方法是处理 tar 归档的入口,他返回一个 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 中的一个归档文件,他包含描述文件属性的文件类型、大小、时间、权限、所有者等信息,还提供了一些方法来归档文件。注意此对象并不包含数据本身。