Python轮子:压缩文件神器gzip

原文链接:http://www.juzicode.com/python-module-gzip

Python的gzip模块是标准库中用于处理gzip格式压缩文件的工具,提供了高效的文件压缩与解压功能,支持多级压缩比设置和流式处理,特别适合处理单个大型文本文件。

应用场景

  • 压缩大型日志文件节省存储空间
  • Web服务器响应gzip压缩内容处理
  • 数据传输前的实时压缩
  • 科学计算数据的压缩存储
  • 与tar结合实现多文件归档压缩
  • 网络爬虫处理压缩的网页内容

模块导入

import gzip
import shutil  # 用于高级文件操作

使用方法

1)创建gzip文件

# juzicode.com/VX公众号:juzicode
import gzip

# 直接写入压缩内容
with gzip.open('example.txt.gz', 'wt', encoding='utf-8') as gz_file:
    gz_file.write("这是使用gzip压缩的文本内容\n")
    gz_file.write("第二行测试数据\n")
    
print("gzip文件创建成功")

运行结果:生成example.txt.gz文件

2)读取gzip文件内容

# juzicode.com/VX公众号:juzicode
import gzip

# 读取压缩文件内容
with gzip.open('example.txt.gz', 'rt', encoding='utf-8') as gz_file:
    content = gz_file.read()
    print("gzip文件内容:\n", content)

运行结果:输出解压后的原始内容

3)压缩现有文件

# juzicode.com/VX公众号:juzicode
import gzip
import shutil

# 压缩现有文件
with open('source.log', 'rb') as f_in:
    with gzip.open('source.log.gz', 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)
        
print("文件压缩成功")

运行结果:生成source.log.gz压缩文件

4)解压gzip文件

# juzicode.com/VX公众号:juzicode
import gzip
import shutil

# 解压到新文件
with gzip.open('source.log.gz', 'rb') as f_in:
    with open('decompressed.log', 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)
        
print("文件解压成功")

运行结果:生成解压后的decompressed.log文件

5)检查gzip文件完整性

# juzicode.com/VX公众号:juzicode
import gzip

def check_gzip_integrity(gzip_path):
    """检查gzip文件是否损坏"""
    try:
        with gzip.open(gzip_path) as f:
            while f.read(1024 * 1024):  # 每次读取1MB
                pass
        print("gzip文件完整无损坏")
    except OSError as e:
        print(f"文件损坏: {str(e)}")

# 使用示例
check_gzip_integrity('example.txt.gz')

运行结果:验证文件完整性

6)自定义压缩级别

# juzicode.com/VX公众号:juzicode
import gzip

# 使用不同压缩级别 (0-9, 9为最高压缩)
with open('large_data.xlsx', 'rb') as f_in:
    with gzip.open('high_compression-level9.xlxs.gz', 'wb', compresslevel=9) as f_out:
        f_out.writelines(f_in)

with open('large_data.xlsx', 'rb') as f_in:
    with gzip.open('high_compression-level1.xlxs.gz', 'wb', compresslevel=1) as f_out:
        f_out.writelines(f_in)

print("不同压缩级别文件创建完成")

7)内存中压缩数据

# juzicode.com/VX公众号:juzicode
import gzip

# 压缩字节数据
data = b"need to compressed" * 1000
compressed = gzip.compress(data)
print(f"原始大小: {len(data)}, 压缩后: {len(compressed)}")

# 解压缩
decompressed = gzip.decompress(compressed)
print("解压验证:", data == decompressed)

运行结果:

原始大小: 18000, 压缩后: 96
解压验证: True

总结

gzip模块核心优势:

  • 专为处理gzip格式优化,压缩效率高
  • 支持从0(不压缩)到9(最高压缩)的压缩级别
  • 提供类似普通文件的API接口,学习成本低
  • 支持文本和二进制模式
  • 内存操作函数适合网络传输场景

注意事项:

  • 主要用于单个文件,多文件需结合tar模块
  • 压缩级别越高,CPU占用越高
  • 文本模式需明确指定编码
  • 大文件处理时推荐使用流式方法
  • 不支持密码保护等安全特性

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注