master-thesis/json_buffered_reader.py
2019-05-08 17:39:41 +02:00

85 lines
2.2 KiB
Python

#!/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))