本文主要介绍以下五种压缩文件的处理:

  • gz:即gzip,通常只能压缩一个文件。与tar结合起来可以实现先打包再压缩
  • tar:linux系统下的打包工具,只打包不压缩
  • tgz:即tar.gz,先用tar打包,然后再用gz压缩得到的文件
  • zip:不同于gzip,虽然使用相似的算法,可以打包压缩多个文件,不过分别压缩文件,压缩率低于tar
  • rar:打包压缩文件,最初用于dos,基于Windows。压缩率比zip高,但速度慢,随机访问速度也慢。

gz

由于gz一般只压缩一个文件,所有常与其他打包工具一起工作。比如可以先用tar打包为X.tar,然后在压缩为X.tar.gz。
解压gz,其实就是读出其中的单一文件。解压得到一个X.tar文件

1
2
3
4
5
6
7
8
9
10
11
import gzip
import os
def ub_gz(filename):
fname=filename.replace(".gz","")
# 创建gzip对象
gfile=gzip.GzipFile(filename)
# gzip对象用read()打开后,写入open()建立的文件中
open(fname,'wb+').write(gfile.read())
# 关闭gzip对象
gfile.close()
ub_gz('roses.tar.gz')

tar

XXX.tar.gz解压后得到XXX.tar,还要进一步解压出来。

tgz与tar.gz是相同的格式,老版本DOS扩展名最多三个字符,故用tgz表示。

由于这里有多个文件,我们先读取所有文件名,然后解压。

1
2
3
4
5
6
7
8
9
10
def un_tar(filename):
tar=tarfile.open(filename)
names=tar.getnames()
if os.path.isdir(filename+'_'):
pass
else:
os.mkdir(filename+'_')
for name in names:
tar.extract(name,filename+'_/')
tar.close()

注:tgz文件与tar文件解压是一样的

zip

与tar类似,先读取多个文件名然后解压

1
2
3
4
5
def un_zip(file_name):
zip_file = zipfile.ZipFile(file_name)
for names in zip_file.namelist():
zip_file.extract(names,file_name)
zip_file.close()

rar

由于rar通常为window下使用,须要额外的Python包rarfile。

1
2
3
4
5
6
7
8
9
10
11
def un_rar(file_name):
rar = rarfile.RarFile(file_name)
file_name = file_name.replace(".rar", "").strip()
# if os.path.isdir(file_name + "_files"):
# pass
# else:
# os.mkdir(file_name + "_files")
# os.chdir(file_name + "_files") # 用于改变当前工作目录到指定的路径
rar.extractall()
rar.close()
un_rar('roses.rar')

不需要通过chdir修改当前工作目录,即文中注释掉的部分,否则报错:

1
rarfile.RarNoFilesError: No files that match pattern were found [10]:

需要将winrar安装目录下的UnRAR.exe拷贝到Python安装目录的Scripts目录下,否则会报以下错误:

1
rarfile.RarCannotExec: Unrar not installed? (rarfile.UNRAR_TOOL='unrar')