Python请求.iter_content()生成器到二进制数据?

时间:2014-03-03 01:05:07

标签: python python-requests

我正在使用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

1 个答案:

答案 0 :(得分:2)

如果你真的想要使用iter_content,你需要在某处缓冲数据。您可能会发现使用Response.raw更容易,因为尽管您的原始问题表明它绝对可以解压缩数据:

r = requests.get(url, stream=True)
data = r.raw.read(decode_content=True)