Python:从文件中读取数据有时会被压缩,有时则不会

时间:2014-03-26 21:59:40

标签: python python-2.7 gzip

我需要从一些通常使用gzip压缩的文件中读取二进制数据。我已经设法使用gzip模块读取数据:

def decode(self, filename):
    with gzip.open(filename, 'rb') as f:
        # ReadData

但是有时文件没有被压缩,在这种情况下我得到一个IOError(因为该文件没有gzip头)。

我可以这样做:

try:
    f = gzip.open(filename, 'rb')
    f._read_gzip_header()
    f.rewind()
except IOError:
    f.close()
    f = open(filename, 'rb')

with f as gz:
    #ReadData

但我觉得这不是解决问题的好方法。

我正在寻找一个解决这个问题的优雅解决方案。我会写几个" decode"几种文件类型的函数。我考虑的解决方案是创建一个GzipFile的子类来处理它,但我相信可能有更好的方法。

我正在使用Python 2.7

提前感谢您的任何建议!

1 个答案:

答案 0 :(得分:1)

根据RFC 1952,您可以检查前两个字节是\x1f还是\x8b

  

会员标题和预告片

     

ID1(身份证1)ID2(身份证2)       它们具有固定值ID1 = 31(0x1f,\ 037),ID2 = 139(0x8b,\ 213),以将文件标识为gzip格式。

例如,

with open('test.gz','rb') as f:
    print(f.read(2))

b'\x1f\x8b' #well, that was gzipped

with open('test','rb') as f:
    print(f.read(2))

b'he' #must not be gzipped

据推测,你会根据这两个字节做一些控制流,然后是f.seek(0)并继续进行。

但老实说?你的解决方案很好(模数不必要的关闭/重新打开部分)。 try/except是pythonic。