|
import io |
|
import logging |
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
class StringIteratorIO(io.TextIOBase): |
|
"""From: https://stackoverflow.com/a/12604375""" |
|
|
|
def __init__(self, iter): |
|
self._iter = iter |
|
self._left = '' |
|
|
|
def readable(self): |
|
return True |
|
|
|
def _read1(self, n=None): |
|
while not self._left: |
|
try: |
|
self._left = next(self._iter) |
|
except StopIteration: |
|
break |
|
ret = self._left[:n] |
|
self._left = self._left[len(ret):] |
|
return ret |
|
|
|
def read(self, n=None): |
|
buf = [] |
|
if n is None or n < 0: |
|
while True: |
|
m = self._read1() |
|
if not m: |
|
break |
|
buf.append(m) |
|
else: |
|
while n > 0: |
|
m = self._read1(n) |
|
if not m: |
|
break |
|
n -= len(m) |
|
buf.append(m) |
|
return ''.join(buf) |
|
|
|
def readline(self): |
|
buf = [] |
|
while True: |
|
i = self._left.find('\n') |
|
if i == -1: |
|
buf.append(self._left) |
|
try: |
|
self._left = next(self._iter) |
|
except StopIteration: |
|
self._left = '' |
|
break |
|
else: |
|
buf.append(self._left[:i+1]) |
|
self._left = self._left[i+1:] |
|
break |
|
return ''.join(buf) |