我正在使用Python的requests API通过HTTP流传输数据,并需要正确解码二进制数据。每个数据块都以一个字节头('H','N'或'S')开头,块包含可变长度的字符串(以及其他内容)。数据经过gzip压缩,因此我想使用.iter_content自动解压缩数据(而不是.raw),并且要迭代数据以检测每个1字节头。但在每个块的主体中,我需要抓取几个字节并对其进行操作。问题在于,由于.iter_content()是一个生成器,我不知道如何将数据转换或提取出来。以下是一个简化的代码块,说明了我想要实现的内容:
resp = self.session.post(myurl, data=payload, stream=True, headers={'Content-Type': 'application/x-www-form-urlencoded'})
if resp.status_code == 200:
for byte in resp.iter_content(1):
if byte == 'H':
print "INFO: Heartbeat"
body = resp.iter_content(9)
print body # THIS DOESN'T WORK SINCE .iter_content IS A GENERATOR
elif byte == 'N':
print "INFO: Snapshot"
len = resp.iter_content(2)
mystr = resp.iter_content(len)
print mystr # ALSO DOESN'T WORK FOR THE SAME REASON
elif byte == 'S':
print "INFO: Streaming"
else:
break
raw.read()
的关键之处在于它实际上是一个 urllib3 HTTPResponse 对象。至于您的转换问题,您需要查看标准库的 struct 模块。 - Lukasaraw.read()
避免将所有内容读入内存吗? - lmonninger