我正在尝试从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
答案 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