How to change a generator ?

Barak, Ron Ron.Barak at lsi.com
Wed Dec 24 11:09:02 EST 2008


Hi,

I have a generator whose aim is to returns consecutive lines from a file (the listing below is a simplified version).
However, as it is written now, the generator method changes the text file pointer to end of file after first invocation.
Namely, the file pointer changes from 0 to 6623 on line 24.

Can you suggest how the generator could be changed, so it will allow me to get the current location in the file after each yield ?

Thanks,
Ron.

$ cat -n generator.py          # listing without line numbers is below
     1  #!/usr/bin/env python
     2
     3  import gzip
     4  from Debug import _line as line
     5
     6  class LogStream():
     7
     8      def __init__(self, filename):
     9          self.filename = filename
    10          self.input_file = self.open_file(filename)
    11
    12      def open_file(self, in_file):
    13          try:
    14              f = gzip.GzipFile(in_file, "r")
    15              f.readline()
    16          except IOError:
    17              f = open(in_file, "r")
    18              f.readline()
    19          f.seek(0)
    20          return(f)
    21
    22      def line_generator(self):
    23          print line()+". self.input_file.tell()==",self.input_file.tell()
    24          for line_ in self.input_file:
    25              print line()+". self.input_file.tell()==",self.input_file.tell()
    26              yield line_.strip()
    27
    28
    29  if __name__ == "__main__":
    30
    31      filename = "sac.log.50lines"
    32      log_stream = LogStream(filename)
    33      log_stream.input_file.seek(0)
    34      line_generator = log_stream.line_generator()
    35      line_ = line_generator.next()

$ python generator.py
23. self.input_file.tell()== 0
25. self.input_file.tell()== 6623

$ wc -c sac.log.50lines
6623 sac.log.50lines
$ cat generator.py
#!/usr/bin/env python

import gzip
from Debug import _line as line

class LogStream():

    def __init__(self, filename):
        self.filename = filename
        self.input_file = self.open_file(filename)

    def open_file(self, in_file):
        try:
            f = gzip.GzipFile(in_file, "r")
            f.readline()
        except IOError:
            f = open(in_file, "r")
            f.readline()
        f.seek(0)
        return(f)

    def line_generator(self):
        print line()+". self.input_file.tell()==",self.input_file.tell()
        for line_ in self.input_file:
            print line()+". self.input_file.tell()==",self.input_file.tell()
            yield line_.strip()


if __name__ == "__main__":

    filename = "sac.log.50lines"
    log_stream = LogStream(filename)
    log_stream.input_file.seek(0)
    line_generator = log_stream.line_generator()
    line_ = line_generator.next()


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20081224/30746e52/attachment-0001.html>


More information about the Python-list mailing list