我需要从一些通常使用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
提前感谢您的任何建议!
答案 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。