Python的tarfile标准库提供了tar命令提供的功能,我们也可以使用它创建一个压缩或非压缩的tar包。

与Python的文件管理操作类似,读写一个压缩包,需要执行打开操作,同时指定文件的打开模式,并在操作完毕以后关闭文件。和Python内置的文件管理类似,我们也可以使用上下文管理器来保证文件的关闭逻辑。

import tarfile

with tarfile.open('tartest.tar',mode='w') as out:
out.add('log.log')
with tarfile.open('tartest.tar') as t:
for member_info in t.getmembers():
print(member_info.name)

在这个例子中,我们首先导入tarfile库,然后我们创建一个tar包,以写模式打开tar包并得到一个TarFile对象,然后使用TarFile对象的add方法将文件添加到tar包中。下面使用默认的读模式打开tar包。tarfile.open函数会返回一个TarFile的对象,用这个对象表示当前打开的tar包,我们可以通过这个对象的方法操作和读取tar包的内容。例如,在这个例子中,我们通过TarFile对象的getmembers方法获取了tar包中的文件列表。tarfile中有不少函数,其中最常用的是:

1、getnames:获取tar包中的文件列表;

2、extract:提取单个文件;

3、extractall:提取所有文件。

我们已经介绍了如何使用tarfile模块创建和读取一个tar包。但是,我们创建和读取的是一个没有经过压缩的tar包。一般情况下,我们创建一个tar包的时候都会使用压缩算法进行压缩,以减少数据传输的带宽和磁盘的存储空间。使用tarfile创建和读取压缩包非常简单,只要在打开文件时指定压缩算法即可。对于tarfile的open函数,以“打开模式:压缩算法”的形式打开即可。

1、创建一个用bzip2算法压缩的tar包:

with tarfile.open('tartest.tar',mode='w:bz2') as out:

2、读取一个用gzip算法压缩的tar包:

with tarfile.open ('tartest.tar', mode='r:gz') as out:

例子:备份指定文件到压缩包

import tarfile
import datetime

def main():
now = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
filename = "all_log_{0}.tar.gz".format(now)#文件名加入时间元素
with tarfile.open(filename,'w:gz') as f:
f.add('log.log')

if __name__ == '__main__':
main()

大部分情况下,我们在Linux下使用gzip或bzip2进行压缩,在Windows下使用zip进行压缩。

读取zip

zipfile模块中有一个名为ZipFile的对象,我们通过将zip压缩包的名称传递给这个对象的构造函数,就打开了zip压缩包文件并得到一个ZipFile的对象,然后使用这个对象的方法去读取zip压缩包的内容。

1、namelist:返回zip文件中包含的所有文件和文件夹的字符串列表;

2、extract:从zip文件中提取单个文件;

3、extractall:从zip文件中提取所有文件。

import zipfile

example_zip = zipfile.ZipFile('apache-maven-3.8.4-bin.zip')
print(example_zip.namelist())#返回zip文件中包含的所有文件和文件夹的字符串列表
example_zip.extractall()

若想创建一个zip格式的压缩文件,必须以写模式打开zip文件。与tarfile不同的是,ZipFile的对象是通过write方法来添加文件的。

import zipfile

newZip = zipfile.ZipFile('new.zip','w')
newZip.write('log.log')
newZip.close()

使用shutil模块创建压缩包,只需调用shutil模块下的make archive函数即可。archive函数有多个参数,其中,只有basename与format这两个参数是必传的。参数 base_name是创建的压缩包的名称,参数format用来指定压缩包的格式,它的取值只能是get_archive_formats函数输出的结果

import shutil

print(shutil.get_archive_formats())
shutil.make_archive('back','zip','.')

在这个例子中,将会自动把当前目录下的所有文件添加到back.zip中。  

调用make_archive函数有几个注意事项:

1、base_name是压缩包的名称,但是不包含相应的文件扩展名,make_archive函数会自动加上相应的扩展名;

2、format这个参数的取值只能是get_archive_format函数的返回值,在本例中,format只能取值为bztar、gztar、tar和zip;  

3、make_archive函数的第三个参数是root_dir,root_dir用来指定创建压缩包的目录,默认为当前目录。典型用法是,将当前目录切换到需要创建压缩包的目录,然后再调用 make_archive函数创建压缩包。

shutil模块包含了一个与make_archive一样好用的解压函数,即unpack_archive函数。

unpack_ archive函数的第一个参数是压缩包的名称,第二个参数是解压以后的保存目录,第三个参数用来指定压缩包的格式。一般情况下,shutil能够根据压缩包的扩展名猜测压缩包的压缩格式,不需要指定format参数。