0

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

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

[1]

例子:

第一个块的最后一项:

{'test1':'value1','test2':'value

第二块的第一项:

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
4

1 回答 1

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
于 2018-02-19T21:42:30.927 回答