code: def next(self):
      
      if not self._filestream:
        if not self._zip:
          self._zip = zipfile.ZipFile(self._reader(self._blob_key))
          # Get a list of entries, reversed so we can pop entries off in order
          self._entries = self._zip.infolist()[self._start_file_index:
                                               self._end_file_index]
          self._entries.reverse()
        if not self._entries:
          raise StopIteration()
        entry = self._entries.pop()
        value = self._zip.read(entry.filename)
        self._filestream = StringIO.StringIO(value)
        if self._initial_offset:
          self._filestream.seek(self._initial_offset)
          self._filestream.readline()
  
      start_position = self._filestream.tell()
      line = self._filestream.readline()
  
      if not line:
        # Done with this file in the zip. Move on to the next file.
        self._filestream.close()
        self._filestream = None
        self._start_file_index += 1
        self._initial_offset = 0
        return self.next()
  
      return ((self._blob_key, self._start_file_index, start_position),
              line.rstrip("\n"))
docs: Returns the next line from this input reader as (lineinfo, line) tuple.
  
      Returns:
        The next input from this input reader, in the form of a 2-tuple.
        The first element of the tuple describes the source, it is itself
          a tuple (blobkey, filenumber, byteoffset).
        The second element of the tuple is the line found at that offset.