Python 进阶系列笔记前置文章链接:
Python 进阶学习笔记之一:内置常用类型及方法
Python 进阶学习笔记之二:常用数据类型(上)
Python 进阶学习笔记之三:常用数据类型(下)
Python 进阶学习笔记之四:高效迭代器工具
Python 进阶学习笔记之五:异步 IO
Python 进阶学习笔记之六:多线程编程
Python 进阶学习笔记之七:互联网支持
Python 进阶学习笔记之八:面向对象高级编程
Python 进阶学习笔记之九:IO 编程
Python 进阶学习笔记之十:一般加密支持
Python 进阶学习笔记之十一:日志支持
——————
Python 为常见的数据压缩和文档压缩提供了独立的模块支持,这些模块包括gzip
、lzma
、zipfile
和tarfile
。
1 gzip 模块
此模块提供的简单接口帮助用户压缩和解压缩数据以及文件内容,功能类似于 UNIX 操作系统中的 gzip 和 gunzip 命令来处理单个文件。
gzip
模块提供 GzipFile
类和 open()
、compress()
、decompress()
几个便利的函数。GzipFile
类可以读写 gzip 格式的文件,还能自动压缩和解压缩数据,这让操作压缩文件如同操作普通的 file object 一样方便。
# 读取 gz 压缩文件
import gzip
with gzip.open('/home/joe/file.txt.gz', 'rb') as f:
file_content = f.read()
写入数据压缩文件
import gzip
content = b"Lots of content here"
with gzip.open('/home/joe/file.txt.gz', 'wb') as f:
f.write(content)
f.write(content) # 数据比较大时,可以分次写入
由一个文件创建压缩文件
import gzip
import shutil
with open('/home/joe/file.txt', 'rb') as f_in:
with gzip.open('/home/joe/file.txt.gz', 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)
只压缩和解压缩数据
import gzip
s_in = b"Lots of content here"
s_out = gzip.compress(s_in)
content = gzip.decompress(s_out)
print(s_in == content) # True
2 bz2 模块
此模块提供了使用 bzip2
压缩算法压缩和解压数据的一套完整的接口,使用方式也很简单。bz2
模块中主要使用一下功能:
- 用于读写压缩文件的 open() 函数和 BZ2File 类。
- 用于增量压缩和解压的 BZ2Compressor 和 BZ2Decompressor 类。
- 用于一次性压缩和解压的 compress() 和 decompress() 函数。
此模块中的所有类都能安全地从多个线程访问。
上面提及的 open()
函数和 BZ2File
类都可以用于读写压缩文件,区别是 open()
可以使用文本模式或二进制模式打开压缩文件,而 BZ2File
类只能以二进制模式打开。
实用比较简单,直接贴代码吧:
# 直接使用 open 函数读写 bz2 文件
import bz2
content = """
hello world
hello world
"""
# 新建一个 bz2 压缩文件并写入内容,压缩级别为6 (压缩级别取值范围 1-9,默认9)
with bz2.open("/home/file.bz2", 'wb', compresslevel=6) as ff:
ff.write(content.encode("utf-8"))
# 打开一个 bz2 压缩文件并读取内容
with bz2.open("/home/file.bz2", 'r') as ff:
ct = ff.read()
print(ct)
# 使用 BZ2File 类读写 bz2 文件
import bz2
content = """
Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue
nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem,
sit amet cursus ante. In interdum laoreet mi, sit amet ultrices puru
pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat.
Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo
felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum
dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum.
"""
with open("/home/file2.bz2",