gzip一般针对单个文件进行压缩,因此需要对多个文件进行压缩时,需要先将多个文件打包成一个文件,再进行压缩。打包多个文件为一个文件时,采用压缩方式,非压缩方式根据需要决定,一般打包为*.tar文件。
gzip模块压缩文件,依然是文件存储的三个步骤:
- 创建文件对象
gz_file = gzip.GzipFile(…) - 写入内容
gz_file.write(…) - 文件对象关闭
gz_file.close()
具体说明(说明其中一种用法)
1 创建文件对象
gz_file = gzip.GzipFile(filename="image.jpg",
mode="wb", compresslevel=9, fileobj=open("C:\\test.gzip", "wb"))
【参数说明】
filename: 需要被压缩文件的名称
mode:和普通文件的模式相同,读或写等,此时创建压缩文件,因此为写模式
compresslevel: 压缩级别,取值为0~9,9为最大压缩比
fileobj: 此处参数为压缩文件对象,其它可选为io.BytesIO对象,或其他类似文件对象
2 写入内容
gz_file.write(value)
【参数说明】
value应为bytes对象
3 关闭文件
gz_file.close()
以下sample采用同一个文件:C:\img.jpg
【sample1】保存压缩文件到硬盘
In [1]: import gzip
# 创建要写入压缩文件的测试数据
In [2]: f = open("C:\\img.jpg", "rb")
In [3]: value = f.read()
In [4]: f.close()
In [5]: gz_file = gzip.GzipFile(filename="img.jpg", mode="wb".
compresslevel=9,
fileobj=open("C:\\test.gzip","wb"))
In [6]: gz_file.write(value)
Out[6]: 53773 # 返回写入的字节数,即原始文件的大小,大小等于 len(value)
In [7]: gz_file.close()
【sample2】使用io.BytesIO保存压缩后的文件内容到内存
In [1]: import gzip
In [2]: from io import BytesIO
# 创建要写入压缩文件的测试数据
In [3]: f = open("C:\\img.jpg", "rb")
In [4]: value = f.read()
In [5]: f.close()
In [6]: str_io = BytesIO()
In [7]: gz_file = gzip.GzipFile(filename="img.jpg", mode="wb",
compresslevel=9, fileobj=str_io)
In [8]. gz_file.write(value)
Out[8]: 53773
In [9]: gz_file.close()
# 此时压缩后的文件内容已经保存到BytesIO中,使用ByteIO.getvalue()函数获取内容
In [10]: v = str_io.getvalue() # 以二进制格式比较保存在硬盘的文件与v所包含的内容
# 除4~7(索引从0开始)字节可能不同外,其余内容完全相同
# 其中4~7字节表示时间戳,因此可能存在不同
In [11]: len(v)
Out[11]: 50910 # 大小等于压缩后文件的大小,如下图显示压缩文件大小一致