Guest User

Reader

a guest
May 12th, 2010
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.54 KB | None | 0 0
  1. class Reader:
  2.     def __init__(self, filename):
  3.         self._delim_ = re.compile(r'\n', re.DOTALL)
  4.         self._size_ = -1
  5.         self._stack_ = []
  6.         self._current_ = type('Reader.Current', (), dict(state=None))
  7.         self.Push(filename)
  8.     def Push(self, filename):
  9.         self._stack_.append(type('Reader.State', (), dict(filename=filename, buffer='', element=0)))
  10.         self._current_.state = self._stack_[-1]
  11.         self._current_.state.file = open(self._current_.state.filename)
  12.     def Pop(self):
  13.         state = self._stack_.pop()
  14.         if len(self._stack_) > 0:
  15.             self._current_.state = self._stack_[-1]
  16.         state.file.close()
  17.         return state
  18.     def __iter__(self):
  19.         current = self._current_
  20.         while True:
  21.             if not current.state:
  22.                 break
  23.             buffer = current.state.file.read(self._size_)
  24.             if len(buffer) == 0:
  25.                 buffer = current.state.buffer
  26.                 self.Pop()
  27.                 if buffer != '':
  28.                     yield buffer
  29.                     if current.state:
  30.                         continue
  31.                 break
  32.             current.state.buffer += buffer
  33.             while True:
  34.                 match = self._delim_.search(current.state.buffer)
  35.                 if not match: break
  36.                 current.state.element += 1
  37.                 buffer = current.state.buffer
  38.                 current.state.buffer = current.state.buffer[match.end():]
  39.                 yield buffer[0:match.end()], current.state.element
Advertisement
Add Comment
Please, Sign In to add comment