Python Requests .iter_content()生成器如何将数据转换为二进制?

5

我正在使用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
1个回答

5
如果您真的非常想使用iter_content,您需要在某个地方缓冲数据。您可能会发现直接使用Response.raw更容易,因为尽管您最初的问题陈述了它不能解压缩数据,但实际上它完全可以解压缩数据:
r = requests.get(url, stream=True)
data = r.raw.read(decode_content=True)

太棒了,谢谢。不幸的是,raw.read() 没有很好的文档说明。我得去查看源代码。现在我只需要知道如何最好地将这些二进制数据转换为它们所代表的不同格式(各种大小的二进制补码整数、单精度和双精度浮点数等)。 - onlinespending
关于 raw.read() 的关键之处在于它实际上是一个 urllib3 HTTPResponse 对象。至于您的转换问题,您需要查看标准库的 struct 模块。 - Lukasa
1
@Lukasa raw.read() 避免将所有内容读入内存吗? - lmonninger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接