2009-11-13 103 views
1

我想使用gzip模块在Python中解压缩gzip文件。前提条件是,我一次获得160个字节的数据,并且在请求下一个160字节之前需要解压缩它。在请求下一个160字节之前,部分解压缩是可以的。我的代码是使用python gzip模块解压文件的一部分

import gzip 
import time 
import StringIO 

file = open('input_cp.gz', 'rb') 
buf = file.read(160) 
sio = StringIO.StringIO(buf) 
f = gzip.GzipFile(fileobj=sio) 
data = f.read() 
print data 

我得到的错误是IOError:CRC校验失败。我假设这是因为它期望整个gzip内容在buf中存在,而我一次只读取160个字节。有没有解决方法?

感谢

+0

相关问题:http://stackoverflow.com/questions/339053/how-do-you-unzip-very-large-files- in-python – jfs 2009-11-14 00:25:15

回答

4

用read()方法(和其他任何GzipFile中从FileObj文件的需要,喜欢接近并寻求),并把它传递给GzipFile中创建自己的类。喜欢的东西:

class MyBuffer(object): 
    def __init__(self, input_file): 
    self.input_file = input_file 

    def read(self, size=-1): 
    if size < 0: 
     size = 160 
    return self.input_file.read(min(160, size)) 

然后使用它像:

file = open('input_cp.gz', 'rb') 
mybuf = MyBuffer(file) 
f = gzip.GzipFile(fileobj=mybuf) 
data = f.read() 
+0

这次没有错误,但空白行是o/p到控制台。很确定160b足以解压缩。也尝试瓦特/ 2000B 类MyBuffer(对象): DEF __init __(个体,INPUT_FILE): self.input_file = INPUT_FILE DEF读(个体,大小= -1): 如果尺寸< 0: 尺寸= 160 返回self.input_file.read(分钟(160,大小)) DEF告诉(个体): 返回 高清寻求(自我,开始,结束): 回报 高清接近(个体经营): 回报 文件=打开( 'input_cp.gz', 'RB') mybuf = MyBuffer(文件) F = gzip.GzipFile(FileObj文件= mybuf) 数据= f.read() 打印数据 – user210126 2009-11-13 02:42:23