0%

Python-数据压缩

常见的数据存档和压缩的模块。如:

  • zipfile:【标准库】zip 文件的压缩解压相关操作
    • tarfile:【标准库】对 tar 压缩包的操作,感觉有一个 zipfile 操作 zip 就够了,OUT
  • zlib:【标准库】 与 gzip 兼容的压缩
  • gzip:【标准库】对 gzip 格式的支持。
  • bz2:【标准库】对 bzip2 压缩算法的支持。
  • lzma:【标准库】用 LZMA 算法压缩。

概述

  • 数据压缩三大指标:压缩时间、解压时间、压缩率
  • 应用场景:
    • 数据传输:网页加载、大数据应用的中间数据传输,主要考虑压缩和解压时间,压缩率不重要。主要工具有 snappy、lz4、gzip 等等。
    • 数据分发:各种软件包的下载,这种情况压缩时间不重要,解压时间和压缩率则会严重影响用户下载、安装软件的体验。主要工具:gz、bzip2、winrar、xz 等。
    • 数据备份:主要看压缩率,对解压时间几乎没有要求(备份的数据几乎不会再使用),主要使用基于 bwt、ppm 等高压缩率算的工具(7z、xz 也勉强可以)。
  • 相关分析:
    • 7z:与 xz 一样基于 lzma 算法,特点是压缩时间长、压缩率高、解压时间短,所以只适用于数据分发和备份,备份一般人是接触不到的,数据分发上 7z 虽然算法本身很适合,但是大部分人是不会预装 7z 的,对这些人来说解压的时间其实是装 7z 的时间 + 实际解压时间,这样一来 7z 的优势就荡然无存了。
    • tar.gz:linux 用得最多,因为能保留 unix 风格的权限,tar 本身不进行压缩,是将所有文件的内容和权限拼成一个文件而已

zipfile

zipfile:【标准库】zip 文件的压缩解压相关操作

tarfile:【标准库】对 tar 压缩包的操作,感觉有一个 zipfile 操作 zip 就够了,OUT

  • ZipFile:压缩包实例:
    • 由 member 块组成,以 ZipInfo 对象形式描述,即 ZipFile 是 ZipInfo 的序列。
      • header 块
      • data 块

基本使用

1
2
with zipfile.ZipFile(zip_file_path,mode='w') as f:
f.write(filename=file_path,arcname=os.path.basename(file_path))
1
class zipfile.ZipFile(file[,mode[,compression[,allowZip64]]])

属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ZipInfo.filename # 文件名称
ZipInfo.date_time # 获取文件最后修改时间(年,月,日,时,分,秒)
ZipInfo.compress_type # 压缩类型
ZipInfo.comment # 文档说明
ZipInfo.extr # 扩展项数据
ZipInfo.create_system # 获取创建该 zip 文档的系统
ZipInfo.create_version # 获取 创建 zip 文档的 PKZIP 版本
ZipInfo.extract_version # 获取 解压 zip 文档所需的 PKZIP 版本
ZipInfo.reserved # 预留字段,当前实现总是返回 0
ZipInfo.flag_bits # zip 标志位
ZipInfo.volume # 文件头的卷标
ZipInfo.internal_attr # 内部属性
ZipInfo.external_attr # 外部属性
ZipInfo.header_offset # 文件头偏移位
ZipInfo.CRC # 未压缩文件的 CRC-32
ZipInfo.compress_size # 获取压缩后的大小
ZipInfo.file_size # 获取未压缩的文件大小

方法

1
2
3
4
5
6
7
8
9
10
11
12
# zip 文档指定文件的信息
ZipFile.getinfo(file_name)
# 所有文件的信息,zipfile.ZipInfo 的列表
ZipFile.infolist()
# 解压,所有文件到当前目录
ZipFile.extract(members[,path[,pwd]])
# 打印 zip 文档内信息到控制台
ZipFile.printdir()
# 设置 zip 文档密码
ZipFile.setpassword(pwd)
# 获取 zip 文档指定文件的二进制数据
ZipFile.read(name[,pwd])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import os
from zipfile import ZipFile

# def add_file_to_zip(file_dir,f_zip):
# for file in os.listdir(file_dir):
# file_path=os.path.join(file_dir,file)
# if os.path.isfile(file_path):
# f_zip.write(file_path)
# elif os.path.isdir(file_path):
# f_zip.write(file_path)
# add_file_to_zip(file_path,fp)

def zip_file_list(file_list,zip_file_path):
f_zip= ZipFile(zip_file_path,mode='a')
for file in file_list:
f_zip.write(file,arcname=os.path.basename(file))
f_zip.close()

# def zipCompress(srcDir, desZipfile):
# fp = ZipFile(desZipfile, mode="a") # 以追加模式打开或创建 zip 文件
# addFileIntoZipfile(srcDir, fp)
# fp.close()


path_list = [
r"C:\Users\user_name\Desktop\test\log_conf.yaml",
r"C:\Users\user_name\Desktop\test\test_try.py",
]
zip_file_list(path_list,'test.zip')
# for file_path in path_list:
# zipCompress(file_path, "test.zip")
1
2
3
4
5
6
7
8
9
10
11
12
import tarfile

# 压缩
tar = tarfile.open('your.tar','w') # 创建一个压缩包
tar.add('/Users/wupeiqi/PycharmProjects/bbs2.log', arcname='bbs2.log') # 将文件添加到压缩包并命名
tar.add('/Users/wupeiqi/PycharmProjects/cmdb.log', arcname='cmdb.log') #
tar.close() # 关闭压缩包

# 解压
tar = tarfile.open('your.tar','r') # 打开一个压缩包
tar.extractall() # 解压包内所有文件(可设置解压地址)
tar.close() # 关闭压缩包

创建加密文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import zipfile
import os

zip_file = zipfile.ZipFile('test.zip', mode='w')
# 二进制格式传递
zip_file.setpassword(b'test')

zip_file.write('./requirements.txt')
zip_file.close()


# 设置的是默认解压缩密码,对于设置压缩文件密码需要用 pyminizip

# 用来解密打开
with zipfile.ZipFile('test.zip', 'r') as zip_file:
zip_file.setpassword(b'password')


zlib

zlib:【标准库】 与 gzip 兼容的压缩

  • 用于压缩与解压缩字符串和文件
1
2
3
4
import zlib
message = 'abcd1234'
compressed = zlib.compress(message)
decompressed = zlib.decompress(compressed)

gzip

gzip:【标准库】对 gzip 格式的支持。

bz2

bz2:【标准库】对 bzip2 压缩算法的支持。

lzma

lzma:【标准库】用 LZMA 算法压缩。

给博主来一杯卡布奇诺