Python请求将.iter_content()生成器转换为二进制数据?
我正在使用Python请求API通过HTTP传输数据,需要正确解码二进制数据。每个数据块都以一个单字节头('H'、'N'或'S')开始,并且这些数据块包含可变长度的字符串(以及其他内容)。数据是gzip压缩的,所以我想使用.iter_内容自动解压缩数据(与.raw相反),并希望对数据进行迭代以检测每个1字节的头。但是在每个块的主体中,我需要获取一些字节并对其进行操作。问题是,我不清楚该怎么做,因为.iter_content()是一个生成器,我不熟悉如何从中转换或提取数据。下面是一段精简的代码,说明了我想要完成的任务:Python请求将.iter_content()生成器转换为二进制数据?,python,python-requests,Python,Python Requests,我正在使用Python请求API通过HTTP传输数据,需要正确解码二进制数据。每个数据块都以一个单字节头('H'、'N'或'S')开始,并且这些数据块包含可变长度的字符串(以及其他内容)。数据是gzip压缩的,所以我想使用.iter_内容自动解压缩数据(与.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
如果你真的想使用iter\U内容,你需要在某个地方缓冲数据。您可能会发现使用
Response.raw
更容易,因为不管您最初的问题是什么,它绝对可以解压缩数据:
r = requests.get(url, stream=True)
data = r.raw.read(decode_content=True)
太棒了,谢谢。不幸的是,raw.read()并没有真正的文档记录。我得看一下源代码。现在我只需要知道如何最好地将这些二进制数据转换为它们所表示的不同格式(不同大小的两个补码整数、单精度和双精度浮点等)。了解
raw.read()
的关键是它实际上是一个。至于转换问题,您需要了解一下标准库的模块。