如果我有一个gzip压缩文件并将其与另一个gzip压缩文件连接在一起,是否可以在python中单独读取文件?
例如:
cat f1.csv.gz f2.csv.gz > f3.csv.gzip
我知道这在Go中是可行的,但有没有办法在Python中执行此操作?
答案 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