Python请求 - ChunkedEncodingError(e) - requests.iter_lines

Hec*_*407 6 python chunked-encoding http-chunked python-requests

我正在ChunkedEncodingError(e)使用Python请求.我正在使用以下内容来删除JSON:

r = requests.get(url, headers=auth, stream=True)
Run Code Online (Sandbox Code Playgroud)

并使用回车作为分隔符迭代每一行,这就是此API区分不同JSON事件的方式.

for d in r.iter_lines(delimiter="\n"):
    d += "\n"
    sock.send(d)
Run Code Online (Sandbox Code Playgroud)

我正在对回车进行分界,然后将其添加回作为端点我正在推动日志实际上期望在每个事件结束时回车.这似乎适用于大约100k日志文件.当我尝试拨打更大的电话时,我会抛出以下内容:

for d in r.iter_lines(delimiter="\n"):
logs_1           |   File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 783, in iter_lines
logs_1           |     for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode):
logs_1           |   File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 742, in generate
logs_1           |     raise ChunkedEncodingError(e)
logs_1           | requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))
Run Code Online (Sandbox Code Playgroud)

更新:我发现API NoneType也在某个时刻发回.那么如何在响应中的某处解释这个空字节而不会破坏一切?每个单独的事件都以a结束\n,我需要能够单独检查每个事件.我应该把内容分块而不是iter_lines?然后确保NoneType块中没有?这样我就不会试图iter_lines超过它NoneType并且它会爆炸?

gus*_*ong 5

ChunkedEncodingError 是由: httplib.IncompletedRead

在此输入图像描述

import httplib

def patch_http_response_read(func):
    def inner(*args):
        try:
            return func(*args)
        except httplib.IncompleteRead, e:
            return e.partial
    return inner

httplib.HTTPResponse.read = patch_http_response_read(httplib.HTTPResponse.read)
Run Code Online (Sandbox Code Playgroud)

我认为这可能是一个补丁.它允许您处理有缺陷的http服务器.

大多数服务器传输所有数据,但由于实施错误,它们会错误地关闭会话,httplib会引发错误并掩盖您宝贵的字节.

  • 这次真是万分感谢。在我的示例中,异常实际上是在“r.iter_lines()”上引发的,那么上面的内容适合在哪里呢?我将“requests”与“stream=True”一起使用,因此我不必先将整个响应读入内存。 (2认同)
  • 这个答案是使用httplib而不是请求的同一问题的模仿. (2认同)
  • 作为澄清,这确实是一种有效的方法。它在 python3 中不起作用,但你可以在 try-except 中使用 `requests.get(..., stream=True)` + `for line in response.iter_lines()`。 (2认同)