Python2.7脚本如何将HTML压缩方式从(pk)zip改为gzip
Python2.7 词典脚本Zip转Gzip压缩修改方案
第一步:修改导入语句
找到原代码第9行的导入行,删除不需要的zipfile模块,新增gzip模块即可,修改后如下:
import sqlite3, sys, gzip, zlib, os
gzip是Python2.7标准库内置模块,不需要额外安装第三方包。
第二步:替换压缩逻辑
找到原代码标注# compress & save的压缩块、以及后续读取压缩文件的代码段(原71-78行左右),直接替换为以下代码即可,完全适配原有数据库插入流程:
# compress & save with gzip.open('_temp', mode='wb') as gf: gf.write(html) # read & insert compressed data with open('_temp', 'rb') as temp_compressed: compressed = temp_compressed.read()
说明:和Zip归档格式不同,gzip是单流压缩格式,不需要先把HTML内容写到
TEMP_DIRECTORY下的临时文件再读取压缩——代码里已经有存储完整HTML内容的html变量,直接把变量内容写入gzip压缩流即可,输出的二进制格式和电子阅读器要求的gzip词典格式完全兼容。
可选性能优化
原脚本每处理一个词条就会做多次磁盘IO(写临时HTML、写临时压缩包、读临时压缩包、删临时HTML),词条量大的时候速度很慢,可以直接把从# create html file到os.remove(TEMP_DIRECTORY + term_stripped)这一段的临时文件逻辑全部删掉,在内存里完成压缩,不需要读写任何中间临时文件,对应段代码修改如下:
# 省略前面的termEdited、duplicateCount判断逻辑 # create HTML html = '<b>' + term + '</b>' + data[0].strip() # 内存直接gzip压缩,不需要临时文件 import io compressed_buffer = io.BytesIO() with gzip.GzipFile(fileobj=compressed_buffer, mode='wb') as gf: gf.write(html) compressed = compressed_buffer.getvalue() # 直接插入数据库 cur.execute('INSERT INTO tblWords (_id, term, description) VALUES(?, ?, ?)', (index, termEdited, sqlite3.Binary(compressed))) # if duplicate then update previous row with [1] if duplicateCount == 2: cur.execute('UPDATE tblWords SET term="' + str(term + "[1]") + '" WHERE _id=' + str(index - 1) + '') prevTerm = term
用内存压缩的话,连一开始创建TEMP_DIRECTORY的逻辑都可以删掉,处理速度会提升数倍。
注意事项
- 如果目标电子阅读器要求特定的gzip压缩级别,可以在
gzip.open或者GzipFile初始化时加compresslevel参数,取值范围1-9,默认是9(最高压缩率,压缩速度最慢),比如gzip.open('_temp', 'wb', compresslevel=6)就是平衡压缩率和速度的常用配置。 - 脚本跑完记得把最后注释掉的
os.remove('_temp')打开,避免目录下残留临时文件。 - 改完可以先拿前10个词条测试,从数据库读出blob内容用gzip解压,确认和原HTML内容一致再全量跑库。
内容的提问来源于stack exchange,提问作者nmyshkin
相关产品推荐
相关产品推荐

