在python中流式解压zip档案

Rah*_*aki 5 python compression zip amazon-s3

有没有办法对单文件 zip 档案进行流式解压?

我目前在 s3 中有任意大的压缩档案(每个档案一个文件)。我希望能够通过遍历文件来处理文件,而不必将文件实际下载到磁盘或内存中。

一个简单的例子:

import boto

def count_newlines(bucket_name, key_name):
    conn = boto.connect_s3()
    b = conn.get_bucket(bucket_name)
    # key is a .zip file
    key = b.get_key(key_name)

    count = 0
    for chunk in key:
        # How should decompress happen?
        count += decompress(chunk).count('\n')

    return count
Run Code Online (Sandbox Code Playgroud)

这个答案演示了一种对 gzip 文件做同样事情的方法。不幸的是,我无法使用该zipfile模块获得相同的技术,因为它似乎需要对正在解压缩的整个文件进行随机访问。

小智 1

zip 标头位于文件末尾,这就是它需要随机访问的原因。请参阅https://en.wikipedia.org/wiki/Zip_(file_format)#Structure

您可以解析本地文件头,该文件头位于简单 zip 文件的开头,并使用解压缩字节zlib(请参阅zipfile.py)。这不是读取 zip 文件的有效方法,虽然它可能适用于您的特定场景,但它也可能在许多有效的 zip 上失败。读取中央目录文件头是读取 zip 的唯一正确方法。