【问题标题】:Struggling to reassemble jsonl from stream努力从流中重新组装 jsonl
【发布时间】:2018-07-29 00:01:05
【问题描述】:

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

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

[1]

例子:

第一个块的最后一项:

{'test1': 'value1', 'test2': '值

第二个块的第一个项目:

e2', 'test3': 'value3'}

[2] def不完整处理器(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

【问题讨论】:

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


    【解决方案1】:

    我通过将原始 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
    

    【讨论】:

      猜你喜欢
      • 2023-02-15
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多