# TODO Logging is interesting for debugging purposes, decide what to do with it from logger import newlogger logger = newlogger(__name__) #import logging #logger.setLevel(logging.WARN) class Reader: def __init__(self, filename): self.filename = filename self._file = None self.lineno = 0 self.charno = 0 self.char = None def open(self): self._file = open(self.filename, "r") return def close(self): self._file.close() return def __enter__(self): self.open() return self def __exit__(self, type, value, tb): self.close() def advance(self): self.charno += 1 if self.char == "\n": self.lineno += 1 self.charno = 0 self.char = self._file.read(1) logger.debug("Read: %s" % self.char.__repr__()) return def peek(self): pos = self._file.tell() ch = self._file.read(1) self._file.seek(pos) return ch if __name__ == "__main__": with Reader(__file__ ) as src: print(src.peek()) while src.peek() != "": src.advance() print(src.char)