从Python中的串联gzip中读取多个文件

时间:2016-05-04 23:07:59

标签: python compression gzip

如果我有一个gzip压缩文件并将其与另一个gzip压缩文件连接在一起,是否可以在python中单独读取文件?

例如:

cat f1.csv.gz f2.csv.gz > f3.csv.gzip

我知道这在Go中是可行的,但有没有办法在Python中执行此操作?

2 个答案:

答案 0 :(得分:1)

是。使用z = zlib.decompressobj(31),然后使用z解压缩,直到z.unused_data不为空,或者您已处理完所有输入。如果z.unused_data为非空,则它包含下一个gzip流的开头。创建一个新的y = zlib.decompressobj对象,并使用z.unused_data的内容开始解压缩,继续处理该文件中的更多数据。

这将打印每个连接的gzip组件的未压缩大小:

#!/usr/bin/python
import sys
import zlib
z = zlib.decompressobj(31)
count = 0
while True:
    if z.unused_data == "":
        buf = sys.stdin.read(8192)
        if buf == "":
            break
    else:
        print count
        count = 0
        buf = z.unused_data
        z = zlib.decompressobj(31)
    got = z.decompress(buf)
    count += len(got)
print count

答案 1 :(得分:0)

@马克阿德勒 非常感谢您的回答。它实际上帮助了我很多!

现在我只想添加一个可以节省您大量时间的小细节。当前的答案不会检测被截断的文件,例如 gzip/zcat。

zcat file.gz 
gzip: file.gz: unexpected end of file

要更正此问题,请选中 decompress.oef。如果为 False,这意味着 gzip 文件被截断。如果您不这样做,您将永远不会看到错误。

修改后的代码如下:

#!/usr/bin/python
import sys
import zlib
z = zlib.decompressobj(31)
count = 0
while True:
    if z.unused_data == "":
        buf = sys.stdin.read(8192)
        if buf == "":
            # check truncated file
            if not z.eof:
                raise RuntimeError("unexpected end of file")
            break
    else:
        print count
        count = 0
        buf = z.unused_data
        z = zlib.decompressobj(31)
    got = z.decompress(buf)
    count += len(got)
print count