如何在python中获取> 4GB .gz文件的未压缩大小

时间:2019-01-23 14:12:47

标签: python byte gzip

因此,已经有this super interesting thread关于获取.gz文件的原始大小的信息。事实证明,从4个文件中可以得到的大小结束字节“就在”那里,以确保提取成功。但是:如果提取的数据大小小于2 ** 32字节,则可以依靠它。即。 4 GB。

现在,如果,有超过4 GB的未压缩数据,那么.gz中必须有多个成员!最后4个字节仅指示最后一个块的未压缩大小!

那么我们如何获得其他块的结束字节? Reading the gzip specs我看不到

的长度
+=======================+
|...compressed blocks...|
+=======================+

好的。必须取决于CM-压缩方法。可能是deflate。让我们看看the RFC about iton page 11表示“非压缩块”有一个LEN属性,但是当它们告诉压缩对象时,它变得很时髦……

我可以想象

full_size = os.path.getsize(gz_path)
gz = gzip.open(gz_path)
pos = 0
size = 0
while True:
    try:
        head_len = get_header_length(gz, pos)
        block_len = get_block_length(gz, pos + head_len)
        size += get_orig_size(gz, pos + head_len + block_len)
        pos += head_len + block_len + 8
    except:
        break
print('uncompressed size of "%s" is: %i bytes' % (gz_path, full_size)

但是如何get_block_length?!? :|

这可能从未想过,因为...“流数据”。但是我现在不想放弃。 甚至7zip 也显示了一个很大的.gz文件,其精确的未压缩大小仅为最后4个字节。

有人有另一个主意吗?

1 个答案:

答案 0 :(得分:0)

首先,不,不需要多个成员。 gzip成员的长度没有限制。如果未压缩的数据大于4 GB,则最后四个字节仅表示该长度以2 32 为模。实际上,具有4 GB以上未压缩数据的gzip文件很可能是单个成员。

第二,即使对于小的gzip文件,您可以拥有多个成员的事实也是如此。要使文件的最后四个字节无用,未压缩的数据不必超过4 GB。

可靠地确定gzip文件中未压缩数据量的唯一方法是将其解压缩。您不必写出数据,但必须处理整个gzip文件并计算未压缩字节的数量。