努力从流

时间:2018-02-18 17:25:56

标签: python-3.x python-requests streaming chunking jsonlines

我正在尝试从API处理jsonlines,我遇到了request.iter_lines()不及时的问题。我现在必须尝试合并requests.iter_content(chunk_size = 1024 * 1024)。我试图通过逻辑我需要采取一个不完整的jsonline [1]并将它附加到下一个chunk_size,所以它是一个完整的。

我当前的尝试是运行一系列if语句以检测不良状态[2],然后重建它并继续处理,但我没有在所有各种状态下重新组装它,这可能最终导致有人有一个经过深思熟虑解决这个问题的例子吗?

[1]

示例:

第一个大块的最后一项:

{' test1':' value1',' test2':'评估

来自第二块的第一项:

e2',' test3':' value3'}

[2]     def incomplete_processor(main_chunk):

    if not main_chunk[0].startswith('{') and not main_chunk[-1].endswith('\n'):
        first_line = str(main_chunk[0])
        last_line = str(main_chunk[-1])
        main_chunk.pop(0)
        main_chunk.pop(-1)

        return first_line, last_line

    if not main_chunk.startswith('{') and main_chunk[-1].endswith('\n'):
        first_line = str(main_chunk[-1])
        main_chunk.pop(0)

        return first_line

    if main_chunk.startswith('{') and not main_chunk[-1].endswith('\n'):
        last_line = str(main_chunk[-1])
        main_chunk.pop(-1)

        return last_line

1 个答案:

答案 0 :(得分:0)

我通过将原始的rsplit('\ n')转换为双端队列来解决此问题,然后捕获由于不完整的json而引发的任何valueerrors。我存储了错误输出的第一个值,等待下一个值出错,然后组合它们。

while True:
    try:
        jsonline = main_chunk_deque.popleft()
        jsonline = json.loads(jsonline)
    except ValueError as VE:
        if not jsonline.endswith('}'):
            next_line = jsonline
        elif not jsonline.startswith('{'):
                first_line = jsonline
                jsonline = json.loads(next_line + first_line)
        continue
    except IndexError:
        break