使用Python读写tar存档文件(tarfile)

“ tar”实用程序最初是为UNIX操作系统引入的。其目的是将多个文件收集在一个通常称为tarball的单个存档文件中,这使分发文件变得容易。Python标准库的tarfile模块中的函数可帮助创建tar存档并根据需要从tarball中提取。可以使用gzip,bz2和lzma压缩或完全不压缩来构建档案。

此模块中定义的主要功能是main()使用完成写入tar文件或从中读取文件的功能。

打开()

此函数返回与文件名相对应的TarFile对象,该文件名作为参数提供给它。该函数需要另一个名为mode的参数,默认情况下为'r'表示无压缩。其他模式如下

序号模式与动作
1'r'或'r:*'
打开以透明压缩方式阅读。
2'r:'
打开后无需压缩即可阅读。
3'r:gz'
打开以使用gzip压缩进行阅读。
4'r:bz2'
打开以使用bzip2压缩进行读取。
5'r:xz'
以lzma压缩打开以供阅读。
6'x'或'x:'
专门创建不压缩的tarfile。
7'x:gz'
用gzip压缩创建一个tarfile。
8'x:bz2'
创建具有bzip2压缩的tarfile。
9'x:xz'
创建具有lzma压缩的tarfile。
10'a'或'a:'
打开以进行不压缩的追加。
11'w'或'w:'
打开以进行未压缩的写入。
12'w:gz'
打开以进行gzip压缩编写。
13'w:bz2'
打开以进行bzip2压缩写入。
14'w:xz'
为lzma压缩写打开。

该模块定义了TarFile类。代替open()函数,可以通过调用构造函数实例化TarFile对象。

TarFile()

该构造函数还需要一个文件名和模式参数。模式参数的可能值如上 。

此类中的其他方法如下

加()

此方法将文件添加到存档。该方法需要一个名称,该名称可以是文件,目录,符号链接,快捷方式等的名称。默认情况下,递归添加目录。为防止递归加法,请将递归参数设置为False。

添加文件()

此方法将TarInfo对象添加到存档中。

提取所有()

如果未明确提供任何其他路径,则此方法将存档的所有成员提取到当前路径。

提取()

此方法将指定成员提取到给定路径,默认为当前路径。

以下示例打开一个使用gzip算法压缩的tar文件,并在其中添加文件。

>>> fp = tarfile.open("zen.tar.gz","w:gz")
>>> fp.add("zen.txt")
>>> fp.close()

假设当前工作目录中存在“ zen.txt”文件,则将其添加到“ zen.tar.gz”文件中。

以下代码从tar归档文件中提取文件,并提取所有文件(在这种情况下,仅存在于其中)并将它们放置在当前文件夹中。要验证结果,您可以删除或重命名当前文件夹中的“ zen.txt”。

>>> fp = tarfile.open("zen.tar.gz","r:gz")
>>> fp.extractall()
>>> fp.close()

您会发现“ zen.txt”文件将出现在当前目录中。

要创建包含当前目录中所有文件的tar,请使用以下代码

import tarfile, glob
>>> fp=tarfile.open('file.tar','w')
>>> for file in glob.glob('*.*'):
fp.add(file)
>>> fp.close()

命令行界面

tar文件的创建和提取可以通过命令行界面来实现。例如,通过在命令窗口中执行以下命令,将“ lines.txt”文件添加到tar文件中

C:\python36 >python -m tarfile -c line.tar lines.txt

可以使用以下命令行选项。

-l或--list在tarfile中列出文件。
-c或--create从源文件创建tarfile。
-e或--extract如果未指定output_dir,则将tarfile提取到当前目录中。
-t或--test测试tarfile是否有效。
-v或--verbose详细输出。

以下命令行将在当前目录下的newdir文件夹中提取line.tar。

C:\python36>python -m tarfile -e line.tar newdir/

以下命令行将列出tar归档文件中的所有文件。

C:\python36>python -m tarfile -l files.tar

这篇关于tarfile模块的文章解释了其中定义的类和函数。