'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.'

def next(self):

    if (not self._filestream):
        if (not self._zip):
            self._zip = zipfile.ZipFile(self._reader(self._blob_key))
            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):
        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'))
