Python Requests .iter_content() 生成器转为二进制数据?
我正在使用Python的requests库通过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
1 个回答
5
如果你真的很想使用 iter_content
,那么你需要在某个地方存储这些数据。其实你可能会发现直接使用 Response.raw
更简单,因为尽管你最开始的问题说了什么,实际上它是可以解压数据的:
r = requests.get(url, stream=True)
data = r.raw.read(decode_content=True)