#!/usr/bin/env python3 import json class JSON_buffered_reader(object): def __init__(self, filename: str, serialization_array_depth: int = 1): self.filename = filename self.n = 0 self.serialization_array_depth = serialization_array_depth self.array_d = 0 self.object_d = 0 self.file_obj = None self.buffer = r'' self.json_queue = [] self.eof = False self._open() def _open(self): self.n = 0 self.array_d = 0 self.object_d = 0 self.file_obj = open(self.filename, 'r') def _close(self): self.file_obj.close() def _process_next_line(self): line = self.file_obj.readline() if len(line) == 0: self.eof = True self._close() return for c in line: if c == '[': if self.array_d >= self.serialization_array_depth: self.buffer += c self.array_d += 1 continue elif c == ']': if self.array_d >= self.serialization_array_depth: self.buffer += c self.array_d -= 1 elif c == '{': self.object_d += 1 self.buffer += c continue elif c == '}': self.object_d -= 1 self.buffer += c elif c == ',': if self.array_d == self.serialization_array_depth and self.object_d == 0: continue self.buffer += c elif c == '\n': continue else: self.buffer += c continue assert self.object_d >= 0 assert self.array_d >= 0 if self.object_d == 0: if self.array_d == self.serialization_array_depth: self.json_queue.append(self.buffer) self.buffer = r'' def __iter__(self): return self def __next__(self): while len(self.json_queue) == 0: if self.eof: return None self._process_next_line() return json.loads(self.json_queue.pop(0))