我正在使用Python请求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
答案 0 :(得分:2)
如果你真的想要使用iter_content
,你需要在某处缓冲数据。您可能会发现使用Response.raw
更容易,因为尽管您的原始问题表明它绝对可以解压缩数据:
r = requests.get(url, stream=True)
data = r.raw.read(decode_content=True)