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

5 投票
1 回答
5441 浏览
提问于 2025-04-17 20:33

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

撰写回答